进制符号的多方面阐述

发布时间:2023-05-20

一、二进制

二进制是一种用0和1表示数字的进制。它是计算机内部数据的基础表示方法。

// 二进制转十进制的示例代码
function binaryToDecimal(binary) {
  let decimal = 0;
  for (let i = 0; i < binary.length; i++) {
    decimal += Number(binary[i]) * Math.pow(2, binary.length - i - 1);
  }
  return decimal;
}

以上代码是将二进制转为十进制的实现。需要注意的是,在计算机中,二进制数可以用前缀0b来表示。

二、八进制

八进制是一种用0~7表示数字的进制。在现代计算机中不太常用,但在Unix、Linux等系统的文件权限中经常使用到。

// 八进制转十进制的示例代码
function octalToDecimal(octal) {
  let decimal = 0;
  for (let i = 0; i < octal.length; i++) {
    decimal += Number(octal[i]) * Math.pow(8, octal.length - i - 1);
  }
  return decimal;
}

注意,在计算机中,八进制数可以用前缀0来表示。

三、十六进制

十六进制是一种用09及AF(大小写不敏感)表示数字的进制。它在计算机中广泛使用,因为它可以用更少的位数表示同样的数值,并且更便于人类阅读。

// 十六进制转十进制的示例代码
function hexToDecimal(hex) {
  let decimal = 0;
  for (let i = 0; i < hex.length; i++) {
    let digit = hex[i];
    if (digit >= '0' && digit <= '9') {
      decimal += Number(digit) * Math.pow(16, hex.length - i - 1);
    } else if (digit >= 'a' && digit <= 'f') {
      decimal += (digit.charCodeAt(0) - 87) * Math.pow(16, hex.length - i - 1);
    } else if (digit >= 'A' && digit <= 'F') {
      decimal += (digit.charCodeAt(0) - 55) * Math.pow(16, hex.length - i - 1);
    }
  }
  return decimal;
}

计算机中,十六进制数可以用前缀0x表示。

四、进制间转换

进制间转换需要了解每种进制数的表示方法以及位权的定义。以下提供进制间转换的示例代码。 十进制转其他进制:

function decimalToBinary(decimal) {
  let binary = '';
  while (decimal !== 0) {
    binary = (decimal % 2) + binary;
    decimal = Math.floor(decimal / 2);
  }
  return binary;
}
function decimalToOctal(decimal) {
  let octal = '';
  while (decimal !== 0) {
    octal = (decimal % 8) + octal;
    decimal = Math.floor(decimal / 8);
  }
  return octal;
}
function decimalToHex(decimal) {
  let hex = '';
  while (decimal !== 0) {
    let digit = decimal % 16;
    if (digit < 10) {
      hex = digit + hex;
    } else {
      hex = String.fromCharCode(digit + 55) + hex;
    }
    decimal = Math.floor(decimal / 16);
  }
  return hex;
}

其他进制转十进制:

function binaryToDecimal(binary) {
  let decimal = 0;
  for (let i = 0; i < binary.length; i++) {
    decimal += Number(binary[i]) * Math.pow(2, binary.length - i - 1);
  }
  return decimal;
}
function octalToDecimal(octal) {
  let decimal = 0;
  for (let i = 0; i < octal.length; i++) {
    decimal += Number(octal[i]) * Math.pow(8, octal.length - i - 1);
  }
  return decimal;
}
function hexToDecimal(hex) {
  let decimal = 0;
  for (let i = 0; i < hex.length; i++) {
    let digit = hex[i];
    if (digit >= '0' && digit <= '9') {
      decimal += Number(digit) * Math.pow(16, hex.length - i - 1);
    } else if (digit >= 'a' && digit <= 'f') {
      decimal += (digit.charCodeAt(0) - 87) * Math.pow(16, hex.length - i - 1);
    } else if (digit >= 'A' && digit <= 'F') {
      decimal += (digit.charCodeAt(0) - 55) * Math.pow(16, hex.length - i - 1);
    }
  }
  return decimal;
}

五、进制的应用

进制数广泛应用于计算机领域,如IP地址、MAC地址、文件权限等。 例如,在IP地址中,为了方便运算和保存,将四个八位的二进制数转换为十进制数表示。 以下是获取本机IP地址的示例代码:

const os = require('os');
const ifaces = os.networkInterfaces();
Object.keys(ifaces).forEach(function (ifname) {
  let alias = 0;
  ifaces[ifname].forEach(function (iface) {
    if ('IPv4' !== iface.family || iface.internal !== false) {
      return;
    }
    if (alias >= 1) {
      console.log(ifname + ':' + alias, iface.address);
    } else {
      console.log(ifname, iface.address);
    }
    ++alias;
  });
});

以上代码是使用Node.js获取本机IP地址的实现。获取到的地址为十进制表示。