我遇到了此功能:
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的倍数以及为什么选择&
。
答案 0 :(得分:1)
我通常想知道此函数在做什么(为什么它要返回数组以及数组元素是什么)。
它返回组成int32值的4个字节的数组。为什么有人编写代码来做到这一点?我不知道。
然后,我想知道为什么它要取v并执行看起来像符号翻转和某些乘法的事情。
因为int32就是这样工作的:0x7FFFFFFF + 1 === -0x80000000
。
尽管在此代码中不必要,但是位操作将处理所有事情。
最后,每个项目的位移和&的含义,为什么是8的倍数以及为什么选择0xFF。
获取int32的不同字节,每个字节长8位。