一个二进制转为有符号的十进制

1,070 阅读1分钟

为了记录一下自己在项目中遇到的二进制数转化成有符号的十进制,因为在网上没找到合适的,所以自己写了一下然后记录

function handleMinus(num){
  // num 为10进制 将数值 通过10 进制作为中间变量进行转换 去除字符位 取反+1
  // 如果创建是unit8Array,传进来的16进制溢出会自动取后面 例 0xfaa ==> aa
  // 也可以直接传入num 进行计算
  var minus_hexnum = '',// 16进制数
  minus_binarynum = '',// 2进制
  bitNum = 0, // 16进制的bit位数 1字节=2个16进制数 1个16进制数位 = 4个bit位(2进制数位)
  binarynum_unsign = ""; // 二进制除去字符位
  minus_hexnum = num.toString(16); //转成16进制
  if (minus_hexnum.length<2) minus_hexnum= '0'+minus_hexnum; // 对16进制进行补零,方便计算bit位 因为js转义不会进行补零 例如:本应该转0x0f ==> 却转成 0xf 
  minus_binarynum = parseInt(minus_hexnum, 16).toString(2); // 转换成2进制

  bitNum = minus_hexnum.length * 4; // 计算应有的bit位
  if(minus_binarynum.length < bitNum) { // bit位进行补0
    while (minus_binarynum.length < bitNum) {
      minus_binarynum = "0" + minus_binarynum;
    }
  }
  if (minus_binarynum.substring(0, 1) == "0") {
    minus_binarynum = parseInt(minus_binarynum, 2);
    } else {
      minus_binarynum = parseInt(minus_binarynum, 2) - 1;
      minus_binarynum = minus_binarynum.toString(2);
      binarynum_unsign = minus_binarynum.substring(1, bitNum);
      binarynum_unsign = binarynum_unsign.replace(/0/g, "x");
      binarynum_unsign = binarynum_unsign.replace(/1/g, "0");
      binarynum_unsign = binarynum_unsign.replace(/x/g, "1");
      minus_binarynum = parseInt(-binarynum_unsign, 2);
    }
    return minus_binarynum;
}
例子:
let unit8 = new Unit8Array([250])
handleMinus(unit8[0]) //-6
handleMinus(250) //-6 结果是一样的,看在什么情况下使用