不清楚使用Bitwise AND赋值

8 c++ operators bitwise-operators

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

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

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

while (...)
{
   ... some code ...
   X++;
   X &= (1024 - 1);
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Dan*_*Dan 14

它们&=和它们++在一起是相同的,X = (X + 1) % 1024;但CPU可以更快地计算出来.


1024-111 1111 1111二进制的,所以对于数字,其中X < 1024,按位AND将不起作用(因为任何位&1 =相同的位).有趣的事情只有在X≥1024的情况下才会开始发生,所以让我们考虑一下X在1023处开始的循环的迭代.

X++;           // X= 100 0000 0000
X &= 1024-1;   //  &  11 1111 1111
               // so, X=0.
Run Code Online (Sandbox Code Playgroud)

然后,在上下文中,正在发生的是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
*/
Run Code Online (Sandbox Code Playgroud)


ben*_*ous 12

1024 - 11023,二进制是1111111111

X &= Y意思X = X & Y;

所以这转化为 X = X & (binary) 1111111111

这将掩盖除了十个最低位之外的所有内容.

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

  • 非常感谢大家的精彩回答!“这将使 X 从 0 环绕到 1023”是我所希望的。 (2认同)