按位运算符 x >> 1 和 x >> 0

5

4
65 = 1000001,将位移可以得到0100000,它代表的是32 - user657496
2
可能是这些运算符是做什么用的?>>在JavaScript中是什么意思?在JavaScript中>>,<<,|和&的含义的重复问题。http://stackoverflow.com/search?q=javascript+bitwise - Andy E
7个回答

8
var size = (Math.random() * 100 >> 0) + 20;

在上面的示例中,>> 0用于消除小数部分,具体如下:
  1. Math.random()返回0到0.99999999之间的数字。
  2. 这个数字乘以100会得到0到99.999999之间的另一个数字。
  3. 这个数字向右移动0次。该数字在进行移位操作时会隐式转换为整数;向右移动0次不会对结果整数的值产生任何影响。因此,您最终得到的是0到99之间的整数。请注意,您也可以使用Math.floor()函数代替>> 0
  4. 将整数加20,结果是介于20和119之间的整数。

3

按位运算符>>表示向右移位。
它将二进制值向右移动(并删除最右边的位)。

二进制中65 >> 1是:

1000001 >> 1 = 100000 = 32

它有效地将数字除以2并且舍去余数。


2
运算符'>>'将变量的内容向右移动1位。这实际上会导致该值被2整除,就像你在示例中展示的那样,这对应一个整数除法操作。
   65 >> 1 = 32

假设一个变量总是32位长。接下来的例子中提到:
   65 decimal >> 1 = 32  or, in hex, 0x000041 >> 1 = 0x00000020

更一般地说:运算符“>>”将其操作数作为32位整数除以2的幂,其值为移位长度。因此:
  129 decimal >> 1 = 64  or  0x000081 >> 1 = 0x000040
  129 decimal >> 2 = 32  or  0x000081 >> 2 = 0x000020
  129 decimal >> 5 =  2  or  0x000081 >> 5 = 0x000002

并且

  129 decimal >> 8 =  0  or: 0x000081 >> 8 = 0x000000

运算符'<<'将其操作数乘以,就像您预期的那样。

我不知道Math.random()是如何操作的,但我愿意打赌将其浮点返回值向右移动0位,将该数字转换为整数,因为只有当操作数为整数时,左移和右移才具有算术意义。


0

0

>> X 接受二进制数并将所有数字向右移动 X 个位置。

在您的示例中,您使用了65,它的二进制表示为01000001。如果您将其向右移动一位,则左侧的第一个空格将填充为0,并且最后一位数字“掉落”。得到00100000,这是32的二进制表示。

>> 0,因此将数字向右移动0个位置,什么也不做。


'

'<< X'

表示将数字向左移动相同位数的结果。该内容与编程有关。


这可以类比于乘以2^X(左移)或除以2^X(右移),但需要注意的是,二进制移位比除法运算快得多。


1
">> 0,因此将数字向右移动0个位置,什么也不做" - 这是不正确的。在JavaScript中,它会将数字转换为32位整数。对于已经是32位整数的数字,它似乎不起作用,但对于较大的数字或浮点数,它将相应地减小/取整。 - Andy E

0
你可以理解为什么 rsplak 的帖子中输出是32。>> 是右移位运算符,使用它作为 >> 1 将导致每个位都向右移动一位。这意味着,如果最右边的位是1,它将被排除,而最左边的位将包含0

0

位运算符将表达式按位移动指定的位数。因此,在您的示例中,您有65,它是二进制0100 0001向右移动1个位置,因此您得到0010 0000,其为32十进制。

另一个例子: 48 >> 3 = 6

48十进制为0011 0000二进制,向右移动3位为0000 0110,其为6十进制。

对于您的第二个示例,我无法帮助您-我无法想象为什么我要将表达式向右移动0个位置,但也许您可以通过调试找到原因?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接