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

时间:2011-05-19 09:02:01

标签: javascript numbers operators bitwise-operators

  

可能重复:
  What do these operators do?
  >> in javascript

有人可以解释按位运算符>> 1吗?

示例:

65 >> 1 = 32

以及>> 0

在这个例子中它实现了什么:

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

7 个答案:

答案 0 :(得分:6)

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之间的整数。

答案 1 :(得分: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会将该数字转换为整数,因为左右移位有算术运算仅在操作数是整数时才有意义。

答案 2 :(得分:1)

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

65>>二进制1

1000001>> 1 = 100000 = 32

它有效地将数字除以2并删除余数。

答案 3 :(得分:0)

按位移位操作符将输入x位的每个位向右移位(>>)或向左移位(<<<<<<<<<<<<

65是1000001,因此65>> 1 = 0100000,即32。

修改

以下是一些有用的链接:

http://en.wikipedia.org/wiki/Bitwise_operation

http://javascript.about.com/library/blbitop.htm

http://www.java2s.com/Tutorial/JavaScript/0040__Operators/ShiftLeft.htm

答案 4 :(得分:0)

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

在您的示例中,您使用65,即二进制的01000001。如果你向右移动一个,第一个空格(在左边)用0填充,最后一个数字'从末尾开始'。给00100000,这是32的二进制表示。

>> 0因此将数字0空格向右移动,并且什么都不做。


'<< X'也是一样,但是将数字向左移动。


可以比较这些乘以2 ^ X(左移)或乘以2 ^ X(右移),但应注意二进制移位比除法运算快得多。

答案 5 :(得分:0)

您可以从rsplak的帖子中了解输出为32的原因。 >>是右移位运算符,并将其用作>> 1将导致每个位向右移位一位。这意味着,如果最右边的位是 1 ,它将被驱逐,最左边的位将包含 0

答案 6 :(得分:0)

按位运算符将表达式移位数位。所以在你的例子中你有 65这是二进制0100 0001 shiftet 1位置向右,所以你有0010 0000这是32十进制。

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

48十进制是0011 0000二进制移位3右边是0000 0110,这是6位小数。

对于你的第二个例子,我无法帮助你 - 我无法想象为什么我会将一个表达式移动0个位置,但也许你可以找到调试它?