2015-01-12 102 views
1

我有一个类似这样的二进制数。var data =“1100110010”。 我想在Javascript中将其转换为适当的带符号的十进制数。如何将二进制数转换为带符号的十进制数

我使用的步骤是以下

1)var data = "1100110010"; var bin2dec = parseInt(data,2).toString(10);

的BIN2DEC给出了转换后的十进制数为 “818”。

但我想访问二进制数的有符号十进制数。

此二进制代码的带符号十进制数是“-206”。

如何从给定的二进制数字访问有符号和无符号十进制值。请告诉我 。任何想法将有助于

回答

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 
    
  • 为什么10UINT价值?因为你的符号int由10位在二进制串表示

    '1100110010'.length; // 10 
    

请注意,对于正数,你不能只是采取nbit = str.length;为字符串可能不是0 -padded,你“会需要知道你实际使用多少位

你也可能要抛出一个错误​​


为了完整起见,

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 
+0

感谢您的答案.. 我正在从十六进制代码获取数据..有什么办法可以找到如果十六进制代码是一个有符号的十进制或无符号的十进制。 以及如何将十六进制代码转换为精确的带符号的十进制 – Chait

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)中显示的数字是否有错字。

可能不是最好的解决方案,但应该工作。在决定是否签名之前,您可能仍然希望检查二进制数字的数量。

+0

这给'-306'而不是'-206' –

+0

我知道,我认为这是一个错字。 –

+0

在'32'位中,'-206'是'11111111111111111111111100110010',所以它看起来像OP有一个10位有符号整数 –

2

使用JavaScript的typed arrays可以将二进制数转换为带符号的小数。

const unsigned = 0b1111111100110010; 
const [ signed ] = new Int16Array([0b1111111100110010]); 

console.log(unsigned); // => 65330 
console.log(signed); // => -206 

我敢肯定,这将比按位操作更少的性能,但它确实少了代码。

相关问题