什么是 (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 1010
和 5 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
产生的值是 1
或 0
,具体取决于 x
的最低有效位:如果最后一位是 1
,x & 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
。假设 x
是 185
,它将以位表示为 10111001
。如果您对 x
和 1
应用按位与运算,结果将是:
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).
如果 'n' 是奇数 (n & 1) 将 return true/1;
否则它将 return 返回 false/0;
(n>>=1)中的'>>'是一个位运算符,叫做“右移”,这个运算符会修改'n'的值,公式为:
(n >>= m) => (n = n>>m) => (n = n/2^m)
阅读 GeeksforGeek 关于“位运算符”的文章,推荐!
我正在尝试做作业:"Find the number of bits in an unsigned integer data type without using the sizeof() function."
而我的设计是将整数转换为位,然后对它们进行计数。例如:10 is 1010
和 5 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
产生的值是 1
或 0
,具体取决于 x
的最低有效位:如果最后一位是 1
,x & 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 either1
or0
, depending on the least significant bit ofx
: if the last bit is1
, the result ofx & 1
is1
; otherwise, it is0
. This is a bitwise AND operation.
这是因为 1
将以位表示为 00000001
。只有最后一位设置为 1
。假设 x
是 185
,它将以位表示为 10111001
。如果您对 x
和 1
应用按位与运算,结果将是:
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 "setx
to itself shifted by one bit to the right". The expression evaluates to the new value ofx
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).
如果 'n' 是奇数 (n & 1) 将 return true/1;
否则它将 return 返回 false/0;
(n>>=1)中的'>>'是一个位运算符,叫做“右移”,这个运算符会修改'n'的值,公式为:
(n >>= m) => (n = n>>m) => (n = n/2^m)
阅读 GeeksforGeek 关于“位运算符”的文章,推荐!