什么是 (x & 1) 和 (x >>= 1)?

What is (x & 1) and (x >>= 1)?

我正在尝试做作业:"Find the number of bits in an unsigned integer data type without using the sizeof() function."

而我的设计是将整数转换为位,然后对它们进行计数。例如:10 is 10105 is 101

Converting integer to a bit representation 显示如下:

do
{ 
    Vec.push_back( x & 1 ) 
} 
while ( x >>= 1 );

我不想只复制粘贴内容。当我使用 F-10 时,我看到 (x & 1) 在做什么,但我不知道它的名字或它是如何工作的(比较什么?)。我也知道 >= 哪个 "greater than or equal" 但是 x >>= 1 是什么?

注意:标记的重复项是 JavaScript 而不是 C++

这些是位运算符 (reference)。

x & 1 产生的值是 10,具体取决于 x 的最低有效位:如果最后一位是 1x & 1的结果是1;否则,它是 0。这是按位与操作。

x >>= 1 表示 "set x to itself shifted by one bit to the right"。表达式的计算结果为移位后 x 的新值。

注:对于无符号类型的值,移位后最高位的值为零。对于有符号类型的值,作为 符号扩展 的一部分,在移位之前从值的符号位复制最高有效位,因此如果 x 是,循环将永远不会完成有符号类型,初始值为负数

类似于x = (x >> 1)

(operand1)(operator)=(operand2)  implies(=>)  (operand1)=(operand1)(operator)(operand2) 

它将x的二进制值右移一位。

例如

int x=3;    // binary form (011) 
x = x >> 1; // zero shifted in from the left, 1 shifted out to the right:
            // x=1, binary form (001)

除了 "dasblinkenlight" 的答案外,我认为一个例子可能会有所帮助。为了更好地理解,我将只使用 8 位。

x & 1 produces a value that is either 1 or 0, depending on the least significant bit of x: if the last bit is 1, the result of x & 1 is 1; otherwise, it is 0. This is a bitwise AND operation.

这是因为 1 将以位表示为 00000001。只有最后一位设置为 1。假设 x185,它将以位表示为 10111001。如果您对 x1 应用按位与运算,结果将是:

00000001
10111001
--------
00000001

运算结果的前七位在运算后将是0,在这种情况下将不携带任何信息(参见Logical AND operation)。因为无论操作数x之前的前七位是什么,操作后它们都是0。但是操作数 1 的最后一位是 1 并且它会显示操作数 x 的最后一位是 0 还是 1。所以在这个例子中,按位与运算的结果将是 1 因为我们 x 的最后一位是 1。如果最后一位是0,那么结果也是0,表示操作数x的最后一位是0:

00000001
10111000
--------
00000000

x >>= 1 means "set x to itself shifted by one bit to the right". The expression evaluates to the new value of x after the shift

让我们选择上面的例子。对于 x >>= 1 这将是:

10111001
--------
01011100

对于左移 x <<= 1 它将是:

10111001
--------
01110010

班次请注意用户"dasblinkenlight"的备注。

x & 1 等同于 x % 2.

x >> 1 等同于 x / 2

所以,这些东西基本上就是除以二的结果和余数

(n & 1) 将检查 'n' 是奇数还是偶数,这类似于 (n%2).

  1. 如果 'n' 是奇数 (n & 1) 将 return true/1;

  2. 否则它将 return 返回 false/0;


(n>>=1)中的'>>'是一个位运算符,叫做“右移”,这个运算符会修改'n'的值,公式为:

(n >>= m) => (n = n>>m) => (n = n/2^m)

阅读 GeeksforGeek 关于“位运算符”的文章,推荐!