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)
">>"是什么意思?它是一种特殊类型的布尔值(如'<'或'>')
从本质上讲,这些运算符用于操纵BIT级别的值.
它们通常与&(按位AND)和|(按位OR)运算符一起使用,并与masks诸如0x7F在问题的片段中找到的类似立即值之类的值相关联.
有问题的片段使用这些运算符来"解析"32位浮点值(符号,指数和分数)的三个分量.
例如,在问题的片段中:
1 - (2*(b1 >> 7)) 产生整数值1或-1,这取决于b1变量中的位7(右起第8位)是否为0或1.
这个成语可以解释如下.
0000000000000000abcdefghb1 = data.charCodeAt(offset) & 0xFF 上面几行的分配,这基本上归零了b1中的所有位,除了右边的8位(0xFF掩码) ).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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
697 次 |
| 最近记录: |