Javascript:将(十六进制)有符号整数转换为 javascript 值

标签 javascript sign

我有一个以十六进制数形式给出的有符号值,例如 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/

相关文章:

javascript - 无法直接注入(inject) Controller

ios - Xcode 变得很慢,我无法再使用实际设备(模拟器没问题)

android - 在 Android 设备上重新签名应用程序(.apk、.air)。类命令行

javascript - 具有动态字段的 Angular 响应式(Reactive)表单

android - 丢失 keystore 密码,但仍有 private_key.pepk : Google signin app

计算 C 列表中的符号变化

html - 在段落中写入 "£"时出错

Javascript,执行一个具有大范围延迟值的函数?

javascript - 带符号反转数字

javascript - 如何让verlet集成碰撞更稳定?