Skip to content

二进制

基本概念

  • 二进制是基数为2的数值,只包含了两个数字:01
  • 计算机使用二进制是因为硬件(如晶体管)只能表示两种状态:开(1)和关(0)。
  • 二进制中的每一位称为一个 比特(bite),8 个比特组成一个 字节(byte)。

进制转换

二转十

方法:按权展开,逐位相加。

公式:

=dn×2n+dn1×2n1+......+d0×20

例如:

10112=1×23+0×22+1×21+1×20=1110

二转十

方法:取2余法。

步骤:

  • 将十进制不断除以2,记录余数。
  • 将余数逆序排序,得到二进制。

示例:

1110÷2=5......15÷2=2......12÷2=1......01÷2=0......1

逆序排序之后得到结果:1011

二转十六:

十六进制转换为十进制是计算机科学和编程中的一个常见任务。十六进制是一种基数为16的数制,使用数字0-9和字母A-F来表示数值。在十六进制中,A代表10,B代表11,C代表12,D代表13,E代表14,F代表15。

示例:

1A3(十六进制) = 1 * 16^2 + A * 16^1 + 3 * 16^0
            = 1 * 256 + 10 * 16 + 3 * 1
            = 256 + 160 + 3
            = 419(十进制)

然后将419转为二进制即可。

二转八:

位运算

位运算是直接对二进制数的每一位直接进行操作,常用于底层编程,性能优化和算法设计。

  1. 基本位运算符

    • 与(AND):&

      规则:两位都为1时,结果位1;否则为0。

      示例:1010 & 1100 = 1000

    • 或(OR):

      规则:两位不同时,结果为1,否则为0。

      示例:1010 | 1100 = 1110

    • 异或(XOR):

      规则:两位不同时,结果为1,否则为0。

      示例:1010 ^ 1100 = 0110

    • 非(NOT):

      规则:对每一位取反。

      示例:~1010 = 0101(假设为4位)

    • 左移(Left Shift):<<

      规则:将二进制数向左移动指定位数,右侧补0。

      示例:1010 << 2 = 101000

    • 右移(Right Shift):>>

      规则:将二进制数向右移动指定位数,左侧补符号位(算术右移)或补0(逻辑右移)。

      示例:1010 >> 2 = 0010

  2. 位运算的应用:

    • 快速乘除:

      左移一位相当于乘以2,右移一位相当于除以2。

      示例:5 << 1 = 10,相当于 5 * 210 >> 2 = 5相当于(10 /2)

    • 掩码操作:

      使用位运算提取或设置特定位。

      示例:提取低4位:x & 0xF

    • 交换变量:

      使用异或运算交换两个变量的值,无需临时变量。

      typescript
      let a = 5, b = 10;
      a = a ^ b;
      b = a ^ b;
      a = a ^ b;
      console.log(a, b); // 输出:10, 5
    • 判断奇偶性:

      使用&运算判断一个数是否为偶数。

      示例:

      typescript
      let x = 1;
      if (x & 1) {
          console.log(`x 是奇数`);
      } else {
          console.log(`x 是偶数`);
      }

位运算在计算机编程中的应用

  1. 位掩码:

    位掩码是一种使用二进制位表示状态的技术,常用于优化存储和操作多个布尔值。

    示例:

    typescript
    const FLAG_A = 1 << 0; // 0001
    const FLAG_B = 1 << 1; // 0010
    const FLAG_C = 1 << 2; // 0100
    
    let flags = 0;
    flags |= FLAG_A; // 设置 FLAG_A
    flags |= FLAG_B; // 设置 FLAG_B
    console.log(flags & FLAG_A ? "FLAG_A 已设置" : "FLAG_A 未设置"); // 输出:FLAG_A 已设置
  2. 权限控制

    使用二进制位表示不同的权限,通过位运算进行权限的检查和设置。

    示例:

    typescript
    const READ = 1 << 0; // 0001
    const WRITE = 1 << 1; // 0010
    const EXECUTE = 1 << 2; // 0100
    
    let userPermissions = READ | WRITE; // 用户有读和写权限
    console.log(userPermissions & READ ? "可读" : "不可读"); // 输出:可读
    console.log(userPermissions & EXECUTE ? "可执行" : "不可执行"); // 输出:不可执行
  3. 数据压缩

    使用二进制位存储多个布尔值或小范围整数,减少内存占用。

    示例:

    typescript
    let packedData = 0;
    packedData |= (1 << 0); // 设置第 1 个布尔值
    packedData |= (0 << 1); // 设置第 2 个布尔值
    console.log(packedData & (1 << 0) ? "第 1 个布尔值为 true" : "第 1 个布尔值为 false"); // 输出:第 1 个布尔值为 true