二进制位移详解


一、变换计算

1. 位与操作

位与即对两个操作数的每个位执行逻辑与操作,只有在对应的位都是 1 时,结果才为 1

对应 Java 操作示例如下,通过 & 执行位与操作。

public void demo1() {
    int a = 9;  // 二进制表示为 1001
    int b = 5;  // 二进制表示为 0101

    int resultAnd = a & b;  // 结果为 0001,即 1
    System.out.printf("Bitwise AND: %s, \tBit: %s\n", resultAnd, Integer.toBinaryString(resultAnd));
}

2. 位或操作

位或即对两个操作数的每个位执行逻辑或操作,只要对应的位有一个为 1,结果就为 1

对应 Java 操作示例如下,通过 | 执行位或操作。

public void demo2() {
    int a = 9;  // 二进制表示为 1001
    int b = 5;  // 二进制表示为 0101

    int resultOr = a | b;  // 结果为 1101,即 13
    System.out.printf("Bitwise OR: %s, \tBit: %s\n", resultOr, Integer.toBinaryString(resultOr));
}

3. 异或操作

亦或即比对相同位置的数,两个数相同时为 0,不同时为 1

对应 Java 操作示例如下,通过 ^ 执行亦或操作。

public void demo3() {
    int a = 9;  // 二进制表示为 1001
    int b = 5;  // 二进制表示为 0101

    int resultXor = a ^ b;  // 结果为 1100,即 12
    System.out.printf("Bitwise XOR: %s, \tBit: %s\n", resultXor, Integer.toBinaryString(resultXor));
}

4. 位非操作

位非即对操作数的每个位执行取反操作,0110

二、位移计算

1. 正数位移

(1) 左移

通过符号 << 表示左移,正数左移在末尾补 0

public void demo1() {
    int a1 = 10;
    // 10, 1010
    System.out.printf("%s, %s\n", a1, Integer.toBinaryString(a1));
    
    int a2 = a1 << 2;  
    // 40, 101000
    System.out.printf("%s, %s\n", a3, Integer.toBinaryString(a2));
}
(2) 右移

通过符号 >> 表示右移,正数右移最高位补符号位 0

public void demo2() {
    int a1 = 10;
    // 10, 1010
    System.out.printf("%s, %s\n", a1, Integer.toBinaryString(a1));

    int a3 = a1 >> 2;
    // 2, 10
    System.out.printf("%s, %s\n", a3, Integer.toBinaryString(a3));
}

2. 负数位移

开始前先看一下如何计算负数的二进制,其步骤如下:

  • 计算其对应绝对值的二进制值;
  • 对得到的值执行取反操作,即每一位都取其相反值;
  • 对得到的反码值加一得到补码,该补码即负数其对应的二进制;

注意计算补码加一时,若对应位计算结果大于 1 则对应计算结果为 0 并向前一位加 1

(1) 左移

通过符号 << 表示左移,负数左移在末尾补 0

public void demo1() {
    int a = 9;  // 二进制表示为 1001
    int b = 5;  // 二进制表示为 0101

    int resultXor = a ^ b;  // 结果为 1100,即 12
    System.out.printf("Bitwise XOR: %s, \tBit: %s\n", resultXor, Integer.toBinaryString(resultXor));
}
(2) 右移

通过符号 >> 表示右移,负数右移最高位补符号位 1

public void demo2() {
    int a = 9;  // 二进制表示为 1001
    int b = 5;  // 二进制表示为 0101

    int resultXor = a ^ b;  // 结果为 1100,即 12
    System.out.printf("Bitwise XOR: %s, \tBit: %s\n", resultXor, Integer.toBinaryString(resultXor));
}

3. 无符号位移

对于无符号右移 >>>,无论是正数还是负数, 右移最高位一律补 0

public void demo1() {
    int a1 = 10;
    // 10, 1010
    System.out.printf("%s, %s\n", a1, Integer.toBinaryString(a1));

    int a4 = a1 >>> 2;
    // 2, 10
    System.out.printf("%s, %s\n", a4, Integer.toBinaryString(a4));
}

文章作者: 烽火戏诸诸诸侯
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 烽火戏诸诸诸侯 !
  目录