javascript - js中如何将无符号数转换为2的补码

标签 javascript ecmascript-6 binary bit-manipulation

我正在尝试使用 javascript 将二进制无符号数转换为二进制补码:

function bin_input_to_num(input) // 2 bit, input is string
{
    return ~Number('0b' + input) + '0b01'; // using ES6
}

console.log(bin_input_to_num('11'));  // actual: -3, expected: -1

我不确定我错过了什么。

(编辑:我已仔细阅读 marked possible duplicate 问题和答案,但它并不能解决我的问题)

最佳答案

在二进制补码中,首先需要判断该数是否是补码。由于所有解析函数都使用减号而不是二进制补码表示,因此我们需要解析正数/无符号数并进行一些调整。如果输入没有被补码(以 0 开头),则很简单,否则我们有三个选择:

  • 对位串求补,解析为数字,将数字补回预期值:

    console.assert(input.length == 2);
    console.assert(input[0] == '1');
    const compl = input.replace(/[01]/g, function(d){return +!+d;});
    const num = parseInt(compl, 2); // or Number('0b' + compl);
    return ~num; // or -(num + 1) or -num-1
    
  • 扩展为 32 位,解析为数字,并使用内置按位运算符转换为带符号的 32 位数字:

    console.assert(input.length == 2)
    console.assert(input[0] == '1');
    const input32 = "1".repeat(30)+input;
    const num = parseInt(input32, 2); // or Number('0b' + input32);
    return num >> 0; // or ~~num or num | 0
    
  • 通过减法实现环绕(可以与非补数情况结合进行模运算以避免分支):

    console.assert(input.length == 2);
    console.assert(input[0] == '1');
    const num = parseInt(input, 2); // or Number('0b' + input);
    return num - 4; // 2²
    

关于javascript - js中如何将无符号数转换为2的补码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44750546/

相关文章:

java - Java中的二进制算术算法

javascript - 在 Node.JS 中编写 CLI 时,您是否应该始终使用向后兼容的代码?

c++ - 读取二进制数据寻找十六进制序列

javascript - IE 11、10 和 9 中的图像缩放很糟糕

javascript - 形状大小不等于表格单元格大小并适合形状内的文本

javascript - 在 Angular 组件中创建 Angular 服务时,如何为其设置自定义构造函数参数?

javascript - 如何根据另一个数组中的值并记住使用数组序列来特定对象中的键值

你能直接用 c 语言家族对表示为二进制数字的值进行编码吗?

Javascript 将 Infinity、NaN 或 ""重新定义为 0

javascript - 检查更改事件中选择框的有效性