我有一个以十六进制数形式给出的有符号值,例如 0xffeb
并希望将其转换为 -21
作为“普通”Javascript 整数。
到目前为止我已经写了一些代码:
function toBinary(a) { //: String
var r = '';
var binCounter = 0;
while (a > 0) {
r = a%2 + r;
a = Math.floor(a/2);
}
return r;
}
function twoscompl(a) { //: int
var l = toBinaryFill(a).length;
var msb = a >>> (l-1);
if (msb == 0) {
return a;
}
a = a-1;
var str = toBinary(a);
var nstr = '';
for (var i = 0; i < str.length; i++) {
nstr += str.charAt(i) == '1' ? '0' : '1';
}
return (-1)*parseInt(nstr);
}
问题是,我的函数返回 1 作为两个数字的 MSB,因为只查看二进制表示“string”的 MSB。对于这种情况,两个数字都是 1:
-21 => 0xffeb => 1111 1111 1110 1011
21 => 0x15 => 1 0101
您有什么想法可以更高效、更好地实现这一点吗?
您好, 神话
最佳答案
使用 parseInt()
进行转换(只接受您的十六进制字符串):
parseInt(a);
然后使用掩码来确定是否设置了 MSB:
a & 0x8000
如果返回一个非零值,你就知道它是负数。
总结一下:
a = "0xffeb";
a = parseInt(a, 16);
if ((a & 0x8000) > 0) {
a = a - 0x10000;
}
请注意,这仅适用于 16 位整数(C 中的 short
)。如果您有 32 位整数,则需要不同的掩码和减法。
关于Javascript:将(十六进制)有符号整数转换为 javascript 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13468474/