首页 > 解决方案 > 将二进制补码数解析为十进制?

问题描述

好吧,我很困惑,这并不比我想象的容易......我想将二进制补码字符串转换为适当的数字:

-5 = '11111011' 根据维基百科

所以我认为以下将返回负 5,但事实并非如此。阅读 Wikipedia 之后,似乎我所要做的就是减去一个然后反转位:

~(parseInt('11111011', 2) - 1)

但它返回-251。令人困惑...

请注意,我将处理许多奇数位长度,并且都不会是 8 位。

标签: javascriptencodingbinarytype-conversion

解决方案


这将采用一个未知的位模式 <= 32 位,如果它是 <8 位,则转换为正整数,如果 >= 8 带有前导 1,则为负符号整数。

诀窍是在 parseInt 之前填充到 32

const getSigned = binStr => parseInt(binStr.length >= 8 && binStr[0] === "1" ?
  binStr.padStart(32, "1") : binStr.padStart(32, "0"), 2) >> 0;

const signed = [
  "11111011",     // -5
  "01111011",     // 123
  "1111111111000" // -8
].map(getSigned);

console.log(signed);


推荐阅读