Javascript 此“long”函数的含义(两个&x27;的补码和位移位)
我遇到了这个函数:Javascript 此“long”函数的含义(两个&x27;的补码和位移位),javascript,numbers,byte,bit-shift,Javascript,Numbers,Byte,Bit Shift,我遇到了这个函数: const LIMIT32=2147483648;//32位数字切换符号的极限==2^31 函数长(v){ //二元补码 如果(v>=LIMIT32){ v=-(2*32-v); } 返回[(v>>24)&0xFF,(v>>16)&0xFF,(v>>8)&0xFF,v&0xFF]; } //例如。 [-3, -2, -1, 0, 1, -2147483649,-2147483648,-2147483647, 214748364721474836482147483649].f
const LIMIT32=2147483648;//32位数字切换符号的极限==2^31
函数长(v){
//二元补码
如果(v>=LIMIT32){
v=-(2*32-v);
}
返回[(v>>24)&0xFF,(v>>16)&0xFF,(v>>8)&0xFF,v&0xFF];
}
//例如。
[-3, -2, -1, 0, 1,
-2147483649,-2147483648,-2147483647,
214748364721474836482147483649].forEach(x=>
log(`${x}:${long(x)}`)
);代码>
我通常想知道这个函数在做什么(为什么返回数组,数组元素是什么)
它返回一个由4个字节组成的数组,这些字节构成一个int32值。为什么有人写代码来做这件事?我不知道
然后我想知道为什么它需要v,做看起来像符号翻转和乘法的事情
因为int32就是这样工作的:0x7FFFFFFF+1===-0x8000000
虽然在这段代码中它是不必要的,但是位操作会处理所有的事情
最后,介绍每个项的位移位和&操作的含义,为什么是8的倍数,以及为什么选择0xFF
获取int32的不同字节,每个字节长8位。它返回一个数组,因为return
语句显式构造了一个数组。它为什么这样做取决于函数在任何上下文中的用途。我认为函数希望以8位字节返回所有内容,这就是该部分。