我有一个像这样的二进制数.. var data =" 1100110010"。 我试图在Javascript中将其转换为适当的带符号十进制数。
我使用的步骤如下
1)var data = "1100110010";
var bin2dec = parseInt(data,2).toString(10);
bin2dec将转换后的十进制数作为" 818" 。
但我也想访问二进制数的带符号十进制数。
此二进制代码的带符号十进制数是" -206"。
如何从给定的二进制数访问有符号和无符号十进制值。请告诉我 。任何想法都会有所帮助
答案 0 :(得分:3)
可以使用JavaScript typed arrays将二进制数转换为带符号的小数。
const unsigned = 0b1111111100110010;
const [ signed ] = new Int16Array([0b1111111100110010]);
console.log(unsigned); // => 65330
console.log(signed); // => -206
我确信这比按位操作的性能要差一些,但它的代码肯定更少。
答案 1 :(得分:1)
这就是你想要的吗?
var data = "1100110010";
var bin2dec = parseInt(data,2).toString(10);
var signed = (data.substr(0,1) === '1' ? '-':'+') + parseInt(data.substr(1),2);
这将为签名号码提供-306。我不确定你在问题中指出的数字是否有拼写错误(-206)。
可能不是最佳解决方案,但应该有效。在决定是否签名之前,您可能仍需要检查二进制数字的数量。
答案 2 :(得分:1)
其他方式:
const bin = "1100110010"
const decimal = parseInt(bin,2)
const numBits = bin.length
let p = 0x80000000 >> (32 - numBits)
console.log(p | decimal)
//or:
console.log(parseInt(bin.padStart(32,'1'),2) | 0)
答案 3 :(得分:0)
使用一些位移技巧
function uintToInt(uint, nbit) {
nbit = +nbit || 32;
if (nbit > 32) throw new RangeError('uintToInt only supports ints up to 32 bits');
uint <<= 32 - nbit;
uint >>= 32 - nbit;
return uint;
}
uintToInt(818, 10); // -206
为什么818
?因为这是二进制字符串
parseInt('1100110010', 2); // 818
为什么10
?因为您的signed int由二进制字符串
10
位表示
'1100110010'.length; // 10
请注意,对于正数,您不能只使用nbit = str.length;
,因为字符串可能不是0
- 填充,您需要知道实际使用的位数< / p>
您可能还想为uint > 4294967295
为了完整,
function intToUint(int, nbit) {
var u = new Uint32Array(1);
nbit = +nbit || 32;
if (nbit > 32) throw new RangeError('intToUint only supports ints up to 32 bits');
u[0] = int;
if (nbit < 32) { // don't accidentally sign again
int = Math.pow(2, nbit) - 1;
return u[0] & int;
} else {
return u[0];
}
}
intToUint(-206, 10); // 818