不清楚使用Bitwise AND赋值

时间:2013-10-25 12:55:36

标签: c++ operators bitwise-operators

最近我在看一些人的C ++项目并试图找出他项目的一些工作原理。我对使用按位AND赋值运算符有点不清楚。

我不能问他,所以我想也许有人可以帮助我...

有一个“ unsigned int X = 0; ”变量,它在while循环中总是增加“1”。

while (...)
{
   ... some code ...
   X++;
   X &= (1024 - 1);
}

我真的不明白使用“& = ”,这种用途的目的是什么?

感谢。

4 个答案:

答案 0 :(得分:14)

&=++一起与X = (X + 1) % 1024;相同,但CPU可以更快地计算出来。


1024-1为二进制11 1111 1111,因此对于X < 1024的数字,按位AND将无效(因为任何位&amp; 1 =相同的位)。有趣的事情只有在X≥1024的情况下才会发生,所以让我们考虑一下X在1023处开始的循环迭代。

X++;           // X= 100 0000 0000
X &= 1024-1;   //  &  11 1111 1111
               // so, X=0.

在上下文中,然后发生的事情是X从0增加到1023,然后跳回到0.您可以在以下测试程序中看到这种情况发生的数字要小得多。为了更容易看到,我使用4(2的不同幂)而不是1024。

#include <iostream>
int main () {
    unsigned int x = 0;
    for (int ii = 0; ii < 10; ++ii) {
        x++;
        x &= (4-1);
        std::cout << "loop iteration #" << ii << ": x=" << x << std::endl;
    }
    return 0;
}
/* expected output:
loop iteration #0: x=1 
loop iteration #1: x=2
loop iteration #2: x=3
loop iteration #3: x=0
loop iteration #4: x=1
loop iteration #5: x=2
loop iteration #6: x=3
loop iteration #7: x=0
loop iteration #8: x=1
loop iteration #9: x=2
*/

答案 1 :(得分:11)

1024 - 11023,二进制为1111111111

X &= Y表示X = X & Y;

因此,这会转换为X = X & (binary) 1111111111

除了十个最低位之外,它将掩盖所有内容。

这将使X环绕从0到1023(但不同于将X重置为零,因为它将处理任何溢出)

答案 2 :(得分:2)

在这种情况下,数字永远不会超过1023。

在二进制文件中,X将是:

0000000000
0000000001
0000000010
0000000011
etc.

因此,当您使用1023(1111111111)进行按位AND时,只保留最低的10位。

答案 3 :(得分:2)

X &= (1024 - 1);

X = X & 1023

并保留所有第一个10位(1023为1111111111二进制)并设置0其余位。

在循环中,确保X不会超过1023非常有用,一个简单的相同代码是:

while (...)
{
   ... some code ...
   X++;
   X = X % 1024; // more closely resembles the original intent
}