“ long”函数的含义(二进制补码和移位)

时间:2019-01-16 06:47:34

标签: javascript numbers byte bit-shift

我遇到了此功能:

First 7 date from today
<br>
<span id='day1'></span>
<span id='day2'></span>
<span id='day3'></span>
<span id='day4'></span>
<span id='day5'></span>
<span id='day6'></span>
<span id='day7'></span>

我通常想知道此函数在做什么(为什么它要返回数组以及数组元素是什么)。

然后,我想知道为什么它要使用const LIMIT32 = 2147483648; // The limit at which a 32-bit number switches signs == 2 ^ 31 function long(v) { // Two's complement if (v >= LIMIT32) { v = -(2 * LIMIT32 - v); } return [(v >> 24) & 0xFF, (v >> 16) & 0xFF, (v >> 8) & 0xFF, v & 0xFF]; } // e.g. [-3, -2, -1, 0, 1, -2147483649,-2147483648,-2147483647, 2147483647,2147483648,2147483649].forEach(x => console.log(`${x}: ${long(x)}`) );并进行类似于符号翻转和乘法的操作。

最后,每个项目的位移和v的含义,为何是8的倍数以及为什么选择&

1 个答案:

答案 0 :(得分:1)

  

我通常想知道此函数在做什么(为什么它要返回数组以及数组元素是什么)。

它返回组成int32值的4个字节的数组。为什么有人编写代码来做到这一点?我不知道。

  

然后,我想知道为什么它要取v并执行看起来像符号翻转和某些乘法的事情。

因为int32就是这样工作的:0x7FFFFFFF + 1 === -0x80000000

尽管在此代码中不必要,但是位操作将处理所有事情。

  

最后,每个项目的位移和&的含义,为什么是8的倍数以及为什么选择0xFF。

获取int32的不同字节,每个字节长8位。