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

时间:2016-08-12 16:25:57

标签: c++ bit-manipulation bitwise-operators bit-shift bitwise-and

我正在尝试进行分配:“在不使用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 ++

6 个答案:

答案 0 :(得分:31)

这些是按位运算符reference)。

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

x >>= 1表示"将x设置为自身向右移动一位"。表达式在移位后评估x的新值。

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

答案 1 :(得分:15)

x & 1相当于x % 2

x >> 1相当于x / 2

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

答案 2 :(得分:10)

除了#34; dasblinkenlight"的回答。我认为一个例子可能有所帮助。我只会使用8位来更好地理解。

  

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

这是因为1将以位00000001表示。只有最后一位设置为1。我们假设x185,它将以位10111001表示。如果您在x上对1应用按位AND操作,则结果为:

00000001
10111001
--------
00000001

操作结果的前七位将是0,并且在这种情况下不会携带任何信息(参见Logical AND operation)。因为操作数x的前七位是在之前,操作之后它们将是0。但操作数1的最后一位是1,它将显示操作数x的最后一位是0还是1。因此,在此示例中,按位AND运算的结果将为1,因为x的最后一位为1。如果最后一位是0,则结果也是0,表示操作数x的最后一位是0

00000001
10111000
--------
00000000
  

x >>= 1表示"将x设置为自身向右移动一位"。该   表达式在移位后评估x的新值

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

10111001
--------
01011100

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

10111001
--------
01110010

请注意用户的注意事项&#34; dasblinkenlight&#34;关于轮班。

答案 3 :(得分:2)

类似于x = (x >> 1)

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

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

E.g。

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)

答案 4 :(得分:1)

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

x >> = 1 的意思是“ 将x自身设置为向右偏移一位”。移位后,该表达式将求值为x的新值。

注:对于无符号类型的值,移位后最高有效位的值为零。对于有符号类型的值,最高有效位是从移位之前的值的符号位复制而来的,这是符号扩展的一部分,因此,如果x是有符号类型且初始值为负,则循环永远不会结束。 / p>

答案 5 :(得分:0)

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

  1. 如果'n'为奇数(n&1)将返回true / 1;

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


(n >> = 1)中的'>>'是按位运算符,称为“右移”,该运算符将修改'n'的值,公式为:

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

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