8

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

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

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

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

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

谢谢。

4

4 回答 4

16

The&=和 the ++together 相同,X = (X + 1) % 1024;但可以由 CPU 更快地计算。


1024-111 1111 1111二进制的,所以对于 where 的数字X < 1024,按位与将不起作用(因为任何位 & 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
*/
于 2013-10-25T13:00:25.020 回答
13

1024 - 11023, 二进制是 1111111111

X &= Y手段X = X & Y

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

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

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

于 2013-10-25T13:00:40.613 回答
2

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

在二进制中,X 将是:

0000000000
0000000001
0000000010
0000000011
etc.

因此,当您对 1023 (1111111111) 进行按位与运算时,只会保留最低 10 位。

于 2013-10-25T13:03:20.777 回答
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
}
于 2013-10-25T13:04:01.617 回答