不清楚按位与赋值的使用

Posted

技术标签:

【中文标题】不清楚按位与赋值的使用【英文标题】:Unclear about the use of Bitwise AND assignment 【发布时间】:2013-11-04 14:39:43 【问题描述】:

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

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

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

while (...)

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

我不太了解“&=”的用法,这种用法的目的是什么?

谢谢。

【问题讨论】:

第一件事。你知道按位与运算的作用吗? 【参考方案1】:

&=++ 加起来与 X = (X + 1) % 1024; 相同,但 CPU 计算速度更快。


1024-1 是二进制的11 1111 1111,因此对于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
*/

【讨论】:

最重要的是,CPU 执行起来要便宜得多。不幸的是,它只适用于 2 的幂。 @Leeor:在回答中注明。【参考方案2】:

1024 - 11023,二进制是 1111111111

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

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

这将屏蔽除最低十位之外的所有内容。

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

【讨论】:

你解释了操作符是如何工作的,但你没有解释它结合循环和X++的目的。 我正在添加您评论的详细信息:) 非常感谢大家的精彩回答! “这将使 X 从 0 环绕到 1023”是我所希望的。【参考方案3】:

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

在二进制中,X 将是:

0000000000
0000000001
0000000010
0000000011
etc.

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

【讨论】:

【参考方案4】:
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

【讨论】:

以上是关于不清楚按位与赋值的使用的主要内容,如果未能解决你的问题,请参考以下文章

按位与&按位或|按位异或^

leetcode 201. 数字范围按位与 解题报告

按位与,按位或,按位异或,按位取反

位运算(按位与按位或异或)

位运算(按位与按位或异或)

PHP 按位与 &