最近我在看一些人的C ++项目并试图找出他项目的一些工作原理。我对使用按位AND赋值运算符有点不清楚。
我不能问他,所以我想也许有人可以帮助我...
有一个“ unsigned int X = 0; ”变量,它在while循环中总是增加“1”。
while (...)
{
... some code ...
X++;
X &= (1024 - 1);
}
我真的不明白使用“& = ”,这种用途的目的是什么?
感谢。
答案 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 - 1
为1023
,二进制为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
}