Javascript中">>"和"<<"的含义是什么?

dez*_*cus 5 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);
}
Run Code Online (Sandbox Code Playgroud)

">>"是什么意思?它是一种特殊类型的布尔值(如'<'或'>')

Sas*_*ley 7

这些是位运算符.看看这个链接:按位运算符


mjv*_*mjv 7

这些是右移(带符号)左移操作符.

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

例如,在问题的片段中:
1 - (2*(b1 >> 7)) 产生数值1或-1,这取决于b1变量中的位7(右起第8位)是否为0或1.
这个成语可以解释如下.

  • 在开始时,b1,表示为位是 0000000000000000abcdefgh
    注意左边的所有位都是零,这来自
    b1 = data.charCodeAt(offset) & 0xFF 上面几行的分配,这基本上归零了b1中的所有位,除了右边的8位(0xFF掩码) ).
    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;
Run Code Online (Sandbox Code Playgroud)