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

San*_*a K 38 c++ bit-manipulation bit-shift bitwise-operators bitwise-and

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

我的设计是将整数转换为位然后计算它们.对于前:10 is 10105 is 101

将整数转换为位表示形式显示如下:

do
{ 
    Vec.push_back( x & 1 ) 
} 
while ( x >>= 1 );
Run Code Online (Sandbox Code Playgroud)

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

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

das*_*ght 38

这些是按位运算符(参考).

x & 1产生一个1或两个值0,取决于最低有效位x:如果最后一位是1,则结果x & 11; 否则就是0.这是一个按位AND操作.

x >>= 1意思是"设置x为自己向右移动一位".表达式计算x移位后的新值.

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

  • `x >> = 1`表达式意味着1)将'x`的值向右移1位,2)将新值赋给`x`和3)返回新值`x`作为表达式的值.没有3,'while`条件将毫无意义. (3认同)

小智 21

x & 1相当于x % 2.

x >> 1 相当于 x / 2

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


sta*_*ker 12

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

x & 1产生一个1或两个值0,取决于最低有效位x:如果最后一位是1,则结果x & 11; 否则就是0.这是一个按位AND操作.

这是因为1将以位为单位表示00000001.只有最后一位设置为1.让我们假设x185将在比特来表示10111001.如果你申请的按位与运算x1这将是结果:

00000001
10111001
--------
00000001
Run Code Online (Sandbox Code Playgroud)

操作结果的前七位将在操作0之后,并且在这种情况下将不携带任何信息(参见逻辑AND操作).因为无论操作数x的前七位是在之前,操作之后它们都是0.但操作数的最后一点11,它会显示,如果操作数的最后一位x01.所以在这个例子中,按位AND运算的结果将是1因为我们的最后一位x1.如果最后一位已经存在0,则结果也是如此0,表明操作数的最后一位x0:

00000001
10111000
--------
00000000
Run Code Online (Sandbox Code Playgroud)

x >>= 1意思是"设置x为自己向右移动一位".表达式计算x移位后的新值

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

10111001
--------
01011100
Run Code Online (Sandbox Code Playgroud)

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

10111001
--------
01110010
Run Code Online (Sandbox Code Playgroud)

请注意用户"dasblinkenlight"关于班次的说明.


Sat*_*dav 5

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

(operand1)(operator)=(operand2)  implies(=>)  (operand1)=(operand1)(operator)(operand2) 
Run Code Online (Sandbox Code Playgroud)

它将 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)
Run Code Online (Sandbox Code Playgroud)