十进制和二进制之间的相互转换

1、十进制转二进制(0和1形式的表示法)

1.1、十进制整数部分转二进制,思路:
将十进制整数取余,得到一个余数,然后将十进制整数除以2取整得到一个新的十进制整数。
然后再将新的十进制整数取余,又得到一个余数,然后再将新的十进数整数除以2取整又得到一个新的十进制整数,
如此循环,直到得到的十进制整数为1时停止,然后将得到的余数按倒序组合起来。如图

1.2、十进制小数部分转二进制,思路:
将十进制小数部分乘以2,然后得到一个积,然后将积的整数部分取出来,
然后再用剩余的小数乘以2,又得到一个积,然后再将积的整数部分取出。
如此循环,直到剩余的小数部分为0或者达到所要求的精度为止,然后将取出的整数按正序组合起来。

十进制转二进制的代码实现

/**
 * 十进制转二进制
 * @param {number} num 要转换数字
 * @param {number|undefined} digits 小数部分的精度
 * @return {string} 返回0和1组成的二进制
 * */
const decimalismToBinarySystem = (num, digits) => {
  if (typeof num !== "number") return num;
  //整数部分
  const integerBits = [];
  let integer = Math.trunc(num);
  while (1) {
    if (!integer) {
      integerBits.push(0);
      break;
    }
    if (integer === 1) {
      integerBits.unshift(1);
      break;
    }
    integerBits.unshift(integer % 2);
    integer = Math.trunc(integer / 2);
  }
  //小数部分
  const decimalBits = [];
  let decimals = num % 1 * 2;
  while (1) {
    if (digits && decimalBits.length === digits) break;
    if (!decimals) {
      decimalBits.push(0);
      break;
    }
    decimalBits.push(Math.trunc(decimals));
    decimals = decimals % 1 * 2;
  }
  return integerBits.concat(['.'], decimalBits).join('');
};

console.log(decimalismToBinarySystem(137.68, 5)); // 10001001.10101
console.log(decimalismToBinarySystem(137.68)); // 10001001.10101110000101000111101011100001010001111010111000011

注:toString方法也可以获取二进制字符串,但是精度可能要自己处理下。

2、二进制(0和1表示法)转十进制


2.1、整数部分计算

// 整数部分 10001001
1 * Math.pow(2, 7) +  0 * Math.pow(2, 6) + 0 * Math.pow(2, 5) + 0 * Math.pow(2, 4) + 1 * Math.pow(2, 3) + 0 * Math.pow(2, 2) + 0 * Math.pow(2,1) + 1 * Math.pow(2, 0) 
// 137

2.2、小数部分计算

// 小数部分 10101
1 * Math.pow(2, -1) + 0 * Math.pow(2, -2) + 1 * Math.pow(2, -3) + 0 * Math.pow(2, -4) + 1 * Math.pow(2, -5)
// 0.65625
// 可能你会奇怪为啥计算的值不是0.68,还记得上面十进制小数转二进制的digits参数吗,由于某些浮点数没办法用二进制准确的表示出来,
// 只能通过设置精度或者自动根据IEEE 754标准来保留适当的位数。digits越大计算的值越精确。
// 10001001.10101110000101000111101011100001010001111010111000011 => 0.6800000000000068

二进制转十进制的代码实现

/**
 * 二进制转十进制
 * @return {string} 返回0和1组成的二进制
 * */
const binarySystemToDecimalism = (str) => {
  if (typeof str !== "string" || !str) return str;
  str = str.split('.');
  let integer = 0;
  if (str.length && str[0]) {
    for (let [index, value] of Object.entries(str[0])) {
      integer += +value * Math.pow(2, str[0].length - index - 1);
    }
  }
  let decimals = 0;
  if (str.length > 1 && str[1]) {
    for (let [index, value] of Object.entries(str[1])) {
      decimals += +value * Math.pow(2, -(+index + 1));
    }
  }
  return integer + decimals;
};

binarySystemToDecimalism('10001001.10101'); // 137.65625
binarySystemToDecimalism('10001001.10101110000101000111101011100001010001111010111000011'); // 137.68
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。