不清楚按位 AND 赋值的使用
Unclear about the use of Bitwise AND assignment
最近我在看某个人的C++项目,并试图弄清楚他的项目的一些工作原理。我有点不清楚使用按位 AND 赋值运算符。
我不能问他,所以我想也许这里有人可以帮助我......
有一个"无符号 int X = 0;""变量,它在 while 循环中全部递增"1"。
while (...)
{
... some code ...
X++;
X &= (1024 - 1);
}
我真的不明白"&="的用法,这种用法的目的是什么?
谢谢。
&=
和++
加起来与X = (X + 1) % 1024;
相同,但 CPU 可以更快地计算。
1024-1
以二进制11 1111 1111
,因此对于 X < 1024
的数字,按位 AND 将不起作用(因为任何位 &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
*/
1024 - 1
1023
,以二进制形式1111111111
X &= Y
的意思是X = X & Y
;
所以这转化为X = X & (binary) 1111111111
这将掩盖除十个最低位之外的所有内容。
这将使 X 从 0 到 1023 环绕(但与将 X 重置为零不同,因为它将处理任何溢出)
在这种情况下,这个数字永远不会大于 1023。
在二进制中,X 将是:
0000000000
0000000001
0000000010
0000000011
etc.
因此,当您使用 1023 (1111111111) 执行按位 AND 时,将只保留最低的 10 位。
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
}
- 为"adjacent"变量赋值时出现问题
- C++中的赋值发生,尽管右侧出现异常
- 用C++中的sscanf赋值
- 为std::string的某个索引赋值
- 重载Singly Linked List中的赋值运算符
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- gtest_使用setargpointee在函数中赋值
- 非常量变量只读位置的赋值
- 使用赋值运算符重载从类中返回jobject
- C++数据文件、数组和计算赋值
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 全局作用域中函数指针的赋值
- 错误:在为指针赋值时,void值没有被忽略
- 标准库类型的赋值运算符的引用限定符
- 关于 c++ 函数中指针赋值的简单问题
- 复制构造函数、赋值运算符C++
- 标准::变体的赋值运算符
- cin >> int 给定一个字符串将 int 赋值为 0
- 不清楚按位 AND 赋值的使用
- c++中的逻辑AND+赋值,安全