“>>”是什么和“<<”在Javascript中意味着什么?

时间:2011-08-09 14:36:17

标签: javascript operators

我有一段我想了解的Javascript代码

// read big-endian (network byte order) 32-bit float
readFloat32 = function(data, offset) {
    var b1 = data.charCodeAt(offset) & 0xFF,
        b2 = data.charCodeAt(offset+1) & 0xFF,
        b3 = data.charCodeAt(offset+2) & 0xFF,
        b4 = data.charCodeAt(offset+3) & 0xFF;
    var sign = 1 - (2*(b1 >> 7));       //<--- here it is and 2 lines below
    var exp = (((b1 << 1) & 0xff) | (b2 >> 7)) - 127;
    var sig = ((b2 & 0x7f) << 16) | (b3 << 8) | b4;
    if (sig == 0 && exp == -127)
      return 0.0;
    return sign * (1 + sig * Math.pow(2, -23)) * Math.pow(2, exp);
}

“&gt;&gt;”是什么意思?它是一种特殊类型的布尔值(如'&lt;'或'&gt;')

10 个答案:

答案 0 :(得分:7)

这些是位运算符。请看一下这个链接:Bitwise Operators

答案 1 :(得分:7)

这些是shift right (with sign)shift left运营商。

基本上,这些运算符用于操纵BIT级别的值 它们通常与&(按位AND)和|(按位OR)运算符一起使用,并与masks值相关联,例如0x7F和类似的立即值找到了问题的片段   有问题的片段使用这些运算符来“解析”32位浮点值(符号,指数和分数)的三个分量。

例如,在问题的片段中:
1 - (2*(b1 >> 7))生成整数值1或-1,具体取决于b1变量中的位7(右起第8位)是零还是一。 这个成语可以解释如下。

  • 在开始时,b1,表示为位0000000000000000abcdefgh
    注意左边的所有位都是零,这来自于 b1 = data.charCodeAt(offset) & 0xFF分配上面的几行,除了右边的8位(0xFF掩码)之外,它基本上将b1中的所有位清零。
    a,b,c ...通过h表示未知的布尔值0或1 我们有兴趣测试a。的价值。
  • b1 >> 7将此值向右移7位,留下
    b1为00000000000000000000000a,读取为整数将具有值1或0
  • 然后将此1或0 整数值乘以2
    然后它分别是2或0。
  • 然后从1中减去该值,留下-1或1。

尽管有助于说明位运算符的工作方式,但上述习语可以被更直接地测试位7并更明确地分配符号变量的东西所取代。此外,这种方法不需要对b1中最左边的位进行初始屏蔽:

var sign
if (b1 & 0x80)   // test bit 7  (0x80 is  [00000000]10000000)
  sign = -1;
else
  sign = 1;

答案 2 :(得分:3)

您可以在此处阅读有关运营商的信息:https://developer.mozilla.org/en/JavaScript/Reference/operators/bitwise_operators

它们是位移,也出现在JS以外的语言中。

示例:5&gt;&gt; 1 = 2

二进制:0101转移一个位置= 0010

答案 3 :(得分:2)

答案 4 :(得分:1)

向左移位b位(用零填充)

a << b

向右移动b位(复制符号位)

a >> b

答案 5 :(得分:1)

来自http://ecma262-5.com/ELS5_HTML.htm

  

11.7按位移位运算符

     

ShiftExpression:      AdditiveExpression       ShiftExpression&lt;&lt; AdditiveExpression       ShiftExpression&gt;&gt; AdditiveExpression       ShiftExpression&gt;&gt;&gt; AdditiveExpression

     

11.7.1左移算子(&lt;&lt;   对左操作数执行按位左移操作,执行右操作数指定的量。   生产ShiftExpression:ShiftExpression&lt;&lt; AdditiveExpression的计算方法如下:

Let lref be the result of evaluating ShiftExpression.
Let lval be GetValue(lref).
Let rref be the result of evaluating AdditiveExpression.
Let rval be GetValue(rref).
Let lnum be ToInt32(lval).
Let rnum be ToUint32(rval).
Let shiftCount be the result of masking out all but the least significant 5 bits of rnum, that is, compute rnum & 0x1F.
Return the result of left shifting lnum by shiftCount bits. The result is a signed 32-bit integer.
     

11.7.2签名右移算子(&gt;&gt;)   对左操作数执行符号填充按位右移操作,操作数由右操作数指定。

     

制作ShiftExpression:ShiftExpression&gt;&gt; AdditiveExpression的计算方法如下:

Let lref be the result of evaluating ShiftExpression.
Let lval be GetValue(lref).
Let rref be the result of evaluating AdditiveExpression.
Let rval be GetValue(rref).
Let lnum be ToInt32(lval).
Let rnum be ToUint32(rval).
Let shiftCount be the result of masking out all but the least significant 5 bits of rnum, that is, compute rnum & 0x1F.
Return the result of performing a sign-extending right shift of lnum by shiftCount bits. The most significant bit is propagated. The result is a signed 32-bit integer.

答案 6 :(得分:0)

左移和右移操作员。如果你有一个数字,它会将它的位向左或向右移动。

答案 7 :(得分:0)

这是位移操作员。有关详细信息,请参阅here

答案 8 :(得分:0)

RightLeft以及移位运营商。

答案 9 :(得分:0)

他们是bithift运营商。计算机中的数字以二进制表示。向左移动相当于乘以2,向右移动相当于除以2。

例如,数字8是二进制的1000。向左移动<< 3将产生1000000,即64.向右移动2将产生10,即2。