Ehs*_*adi 5 javascript byte bit
我需要将一个字节转换为java脚本有符号整数。我已经检查过这个转换 2 个字节的链接,但是我如何降级并只转换一个字节?
例如 0x0A 就是 10,那么 0xD4 呢?
And*_*dyT 11
JavaScript 将按位运算符处理为带符号的 32 位整数。
知道这一点后,如果要对字节进行符号扩展,则需要将该字节的最高位(指示符号)传播到 32 位整数中的所有高位。这可以通过以下方式实现:
value << 24 >> 24
Run Code Online (Sandbox Code Playgroud)
其作用是将字节移至 32 位整数的顶部,然后将其向下移回并保留符号位。
同样,您可以使用以下方法对 16 位值进行符号扩展:
value << 16 >> 16
Run Code Online (Sandbox Code Playgroud)
小智 5
此解决方案使用 2 的补码来转换负数,这是负数编码的标准方式。
function uncomplement(val, bitwidth) {
var isnegative = val & (1 << (bitwidth - 1));
var boundary = (1 << bitwidth);
var minval = -boundary;
var mask = boundary - 1;
return isnegative ? minval + (val & mask) : val;
}
Run Code Online (Sandbox Code Playgroud)
反补(0xFF, 8) 返回-1
反补(0x80, 8) 返回-128
反补(0x7F, 8) 返回127
Ehs*_*adi -3
我想出了这个解决方案:
function convertToSignedInt(signedByte) {
var sign = signedByte & (1 << 7);
return (signedByte & 0x7f) * (sign !== 0 ? -1 : 1);
}
Run Code Online (Sandbox Code Playgroud)
希望它可以节省其他人一些时间。ConvertToSignedInt(0x81) // 返回 -1