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

问题描述 投票:33回答:4

我正在尝试分配:“在不使用sizeof()函数的情况下查找无符号整数数据类型中的位数。”

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

Converting integer to a bit representation显示如下:

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

我不想只是复制粘贴的东西。当我使用F-10时,我看到(x & 1)正在做什么,但我不知道它是名字还是它如何完成它的工作(比较一些东西?)。我也知道>=“大于或等于”但x >>= 1是什么?

注意:标记的副本是JavaScript而不是C ++

c++ bit-manipulation bitwise-operators bit-shift bitwise-and
4个回答
33
投票

这些是按位运算符(reference)。

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

x >>= 1的意思是“将x设置为向右移动一位”。该表达式在移位后评估x的新值。

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


18
投票

x & 1相当于x % 2

x >> 1相当于x / 2

所以,这些东西基本上是结果,剩下的除以二。


10
投票

除了“dasblinkenlight”的答案,我认为一个例子可以帮助。我只会使用8位来更好地理解。

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

这是因为1将以00000001的比特表示。只有最后一位设置为1。让我们假设x185,它将以10111001的比特表示。如果你使用x1上应用按位AND运算,结果将是:

00000001
10111001
--------
00000001

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

00000001
10111000
--------
00000000

x >>= 1的意思是“将x设置为向右移动一位”。该表达式在移位后评估x的新值

我们从上面选择一个例子。对于x >>= 1,这将是:

10111001
--------
01011100

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

10111001
--------
01110010

请注意用户“dasblinkenlight”关于班次的说明。


3
投票

它类似于x = (x >> 1)

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

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

EG

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)

1
投票

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

x >> = 1表示“将x设置为自身向右移动一位”。表达式计算移位后x的新值。

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

© www.soinside.com 2019 - 2024. All rights reserved.