按位位操作拼图

时间:2012-03-24 22:54:52

标签: c++ bit-manipulation

您好我需要的学校作业问题:

读取一个圆数,并使用内部binaire代码,右边的位0和左边的位7。

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

通过示例:

如果我使用十六进制F703变为F7C0 因为03 = 0000 0011,C0 = 1100 0000 (只需要切换正确的字节(8位)。 这个缺点是关于bitmanipulation,但我找不到一种方法来使16个hexnumber正确。 enter image description here

我现在很尴尬,

我正在考虑使用数组来解决这个问题,或者有人可以说我只能用按位^,&,〜,<<,>>,opertors ???

3 个答案:

答案 0 :(得分:0)

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

如果您有2位值,该怎么办?你会如何扭转这些位?

简单的交换会起作用,对吧?考虑如何使用可用的运算符对此交换进行编码。

现在假设您有一个4位值。你会如何扭转这些位?

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

将该解决方案概括为8位值应该是微不足道的。

祝你好运!

答案 1 :(得分:0)

这占了四分之一的工作,但我不会再给你任何帮助了;如果你能解释我为什么这么说,那么你应该能够填写剩下的代码。

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

答案 2 :(得分:0)

研究以下两个功能:

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

给你:

000...0001000...000

1位于第N位。

所以

1 << 0 == 0000...0000001
1 << 1 == 0000...0000010
1 << 2 == 0000...0000100
1 << 3 == 0000...0001000
...

等等。

如果我将上述其中一个数字与其他数字Y联系起来会发生什么?

X = 1 << N
Z = X & Y

Z会是什么样子?那么除了Nth之外的每一点肯定会是0不是吗?因为X中的这些位是0。

Z的第N位是什么?这取决于Y的第N位的值不是吗?那么在什么情况下Z为零?确切地说,当Y的第N位为0.因此,通过将Z转换为bool,我们可以分离出Y的第N位的值。再看看上面的GetBit函数,这正是它正在做的事情。

现在那是读点,我们怎么设置一下?好吧,如果我们想要设置一点,我们可以使用BINARY OR与上面的(1&lt;&lt; N&lt; N)数字之一:

X = 1 << N
Z = Y | X

Z将会在这里?那么除了Nth之外,每一点都会和Y一样吗?并且第N位总是为1.所以我们将第N位设置为开启。

将位设置为零怎么样?我们想做的是取一个像11111011111这样的数字,其中只有第N位关闭然后使用BINARY AND。要获得这样的数字,我们只使用BINARY NOT:

X = 1 << N   // 000010000
W = ~X       // 111101111
Z = W & Y

因此,除了Nth之外,Z中的所有位都是Y的副本.Nth将永远关闭。所以我们有效地将第N位设置为0。

使用上述两种技术是我们如何实现SetBit。

所以现在我们可以读写任意位。现在我们可以像数组那样反转数字的位:

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;
}

请确保您了解这一切。一旦你理解了这一切,请关闭页面并实施和测试它们,而不是看它。

如果您喜欢这个,请尝试其中一些:

http://graphics.stanford.edu/~seander/bithacks.html

和/或得到这本书:

http://www.amazon.com/exec/obidos/ASIN/0201914654/qid%3D1033395248/sr%3D11-1/ref%3Dsr_11_1/104-7035682-9311161