我正在尝试使用 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/