C++ 逐位操作难题

C++ 逐位操作难题,c++,bit-manipulation,C++,Bit Manipulation,你好,我有一个关于学校作业的问题,我需要: 读取一个整数,并使用内部二进制代码,右位为0,左位为7 现在我需要改变: 第0位与第7位 第1位与第6位 第2位与第5位 第3位与第4位 举例来说: 如果使用十六进制F703,则变为F7C0 因为03=0000 0011和C0=1100 0000 (只需切换右字节(8位)。 lession是关于位操作的,但我找不到一种方法来纠正所有16位数字。 我现在在想一个诡计 我正在考虑使用数组来解决这个问题,或者有人可以说我只能使用按位^、&、~、、运算符来完

你好,我有一个关于学校作业的问题,我需要:

读取一个整数,并使用内部二进制代码,右位为0,左位为7

现在我需要改变: 第0位与第7位 第1位与第6位 第2位与第5位 第3位与第4位

举例来说:

如果使用十六进制F703,则变为F7C0 因为03=0000 0011和C0=1100 0000 (只需切换右字节(8位)。 lession是关于位操作的,但我找不到一种方法来纠正所有16位数字。

我现在在想一个诡计


我正在考虑使用数组来解决这个问题,或者有人可以说我只能使用按位^、&、~、、运算符来完成吗?

基本上,您需要反转位顺序。 我们不会为你解决这个问题,但这里有一个提示:

如果你有一个2位的值,你会如何反转这些位呢

一个简单的交换就可以了,对吧?想想如何用你可以使用的操作符来编写这个交换

现在让我们假设你有一个4位的值,你将如何反转这些位

你能把它分成两个2位的值,每一个都反转,然后交换它们吗?这会给你正确的结果吗?现在编码这个

现在,将该解决方案推广到8位值应该很简单


祝你好运!

这只完成了四分之一的工作,但我不会给你更多的帮助;如果你能理解我为什么这么说,那么你应该能够填写代码的其余部分

if ((i ^ (i >> (5 - 2))) & (1 >> 2))
  i ^= (1 << 2) | (1 << 5);
if((i^(i>>(5-2))和(1>>2))

研究以下两种功能:

bool GetBit(int value, int bit_position)
{
    return value & (1 << bit_position);
}

void SetBit(int& value, int bit_position, bool new_bit_value)
{
    if (new_bit_value)
        value |= (1 << bit_position);
    else
        value &= ~(1 << bit_position);
}
其中1位于第n个位置

所以


1您使用的代码是什么?输入的一个例子是什么?您认为这个问题完全错了。不要将其视为“16十六进制数”——这意味着什么?将其视为8位整数中的反转位。我在下面的答案中给了您大量的点击。如果有帮助,&运算符有一个非常好的选择这可以让你开始用一种方法解决这个问题。
1 << N
000...0001000...000
1 << 0 == 0000...0000001
1 << 1 == 0000...0000010
1 << 2 == 0000...0000100
1 << 3 == 0000...0001000
...
X = 1 << N
Z = X & Y
X = 1 << N
Z = Y | X
X = 1 << N   // 000010000
W = ~X       // 111101111
Z = W & Y
int ReverseBits(int input)
{
    int output = 0;

    for (int i = 0; i < N; i++)
    {
        bool bit = GetBit(input, i); // read ith bit

        SetBit(output, N-i-1, bit); // write (N-i-1)th bit
    }

    return output;
}