我有一段我想了解的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;')
答案 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位)是零还是一。
这个成语可以解释如下。
0000000000000000abcdefgh
b1 = data.charCodeAt(offset) & 0xFF
分配上面的几行,除了右边的8位(0xFF掩码)之外,它基本上将b1中的所有位清零。b1 >> 7
将此值向右移7位,留下00000000000000000000000a
,读取为整数将具有值1或0 尽管有助于说明位运算符的工作方式,但上述习语可以被更直接地测试位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)
答案 9 :(得分:0)
他们是bithift运营商。计算机中的数字以二进制表示。向左移动相当于乘以2,向右移动相当于除以2。
例如,数字8是二进制的1000
。向左移动<<
3将产生1000000
,即64.向右移动2将产生10
,即2。