位运算(原码,反码,补码)

发布时间 2023-12-08 15:47:43作者: 测试开发孵化园

免责声明:java基础资料均来自于韩顺平老师的《循序渐进学Java零基础》教案,具体视频内容可以去B站观看,这些资料仅用于学习交流,不得转载用于商业活动

1.位运算

1.1 原码,反码,补码

对有符号的数而言:

  1. 二进制的最高位是符号位:0表示正数,1表示负数(0->0 1->-)
  2. 正数的原码,反码,补码都一样(三码合一)
  3. 负数的反码=他的原码符号位不变,其他位取反(0变1,1变0)
  4. 负数的补码=它的反码+1  负数的反码=负数的补码-1
  5. 0的反码 补码都是0
  6. Java没有无符号数,换言之,Java中的数都是由符号的
  7. 在计算机运算的时候,都是以补码的方式来运算的
  8. 当我们看运算结果的时候,要看他的原码(重点)

1.2 位运算符

Java中有7个位运算(&,|,^,~,>>,<<,>>>)

public class BitOperator {
    public static void main(String[] args) {
        //2&3 推导
        //1.先得到2的补码 =>2的原码 00000000 00000000 00000000 00000010
        //2的补码 00000000 00000000 00000000 00000010
        //2. 3的补码 3的原码 00000000 00000000 00000000 00000011
        //3的补码 00000000 00000000 00000000 00000011
        //3 按位&
        // 00000000 00000000 00000000 00000010
        // 00000000 00000000 00000000 00000011 &
        // 00000000 00000000 00000000 00000010 运算后的补码
        //运算后的原码 也是 00000000 00000000 00000000 00000010
        //结果就是 2
        System.out.println(2&3); //2
        //~-2 推导
        //1 先得到-2的原码 10000000 00000000 00000000 00000010
        //-2的反码 11111111 11111111 11111111 11111101
        //-2的补码 11111111 11111111 11111111 11111110
        //取反(~2)操作 11111111 11111111 11111111 11111110
        //             00000000 00000000 00000000 00000001 (补码)
        // 00000000 00000000 00000000 00000001 最高位是0 正数 所以他的原码是
        // 原码:00000000 00000000 00000000 00000001
        System.out.println(~-2); //1

        //~2取反推导
        //得到补码   00000000 00000000 00000000 00000010
        //取反操作~2 11111111 11111111 11111111 11111101(运算后补码)
        // 是负数 负数的反码 11111111 11111111 11111111 11111100
        // 负数的原码 100000000 00000000 00000000 00000011
        System.out.println(~2); //-3
    }
}

>>、<<、>>>,运算规则是:

算术右移>>:低位溢出,符号位不变,并用符号位补溢出的高位

算术左移<<:符号位不变,低位补0

>>> 逻辑右移也叫无符号右移: 运算规则是:低位溢出,高位补0