Javascript 中的“>>”和“<<”是什么意思?

IT技术 javascript operators
2021-03-11 14:56:29

我有一段 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);
}

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

6个回答

这些是右移(带符号)左移运算符。

本质上,这些运算符用于操作 BIT 级别的值
它们通常与&(bitwise AND) 和|(bitwise OR) 运算符一起使用masks0x7F并与发现问题片段的类似立即值等值相关联
有问题的片段使用这些运算符来“解析” 32 位浮点值的三个组成部分(符号、指数和分数)。

例如,在问题的片段中:根据 b1 变量中的第 7 位(右起第 8 位)分别是 0 还是 1,
1 - (2*(b1 >> 7)) 产生数值 1 或 -1。
这个习语可以解释如下。

  • 一开始,b1,表示为位, 0000000000000000abcdefgh
    注意左边的所有位都是零,这来自
    b1 = data.charCodeAt(offset) & 0xFF 上面几行的赋值,它基本上将 b1 中的所有位都归零,除了 rightmot 8 位(0xFF 掩码) )。
    a, b, c... thru 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;

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

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

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

示例:5 >> 1 = 2

二进制:0101 移一位 = 0010

这是一个算术移位

和移位运算符。