Java位移运算符<<和 >>和 >>>原理详解

Java位移运算符功能详解

目录

Java位移运算符功能详解

准备工作

开始解析

1、<< 左移(不存在<<<)

三种颜色数字含义:

小结:

2、>> 高位以符号位填充

小结:

3、>>> 高位以0填充

小结:

混合测试

总结:

完整测试代码:


准备工作

  1. 计算机基础知识:数字在内存中实际以二进制补码存在
  2. 位移操作符实际操作的就是补码,不是在原码上移动
  3. 正数的原码、反码、补码相同,负数则按下面步骤计算出补码。
  4. Java中数字都有符号,左边第一位就是符号位,1表示负数,0表示非负数
  5. 以二进制原码形式打印数字:Integer.toString(num,2),num为要打印的十进制Int数字,2表示二进制
  6. 以二进制补码打印数字:Integer.toBinaryString(num)
  • 原码:数字的二进制表示码(十进制转二进制手动计算:把十进制数连续对2取余直到商为0,把余数倒序排列就是要求的二进制)
  • 反码:最左边符号位不变,剩下所有位取反,0变1,1变0
  • 补码:反码加 1

开始解析

 

1、<< 左移(不存在<<<)

测试代码如下:cf()方法是我自定义的将int转换成二进制补码并格式化的方法,完整原码在最后

    // 左移
    static void leftMove(){
        System.out.println("int最小值补码 = " + cf(Integer.MIN_VALUE));
        System.out.println("int最大值补码 = " + cf(Integer.MAX_VALUE));
        int num = -129;
        String binary = bf(num); // 原码
        String complement = cf(num); // 补码
        System.out.println(num + " 原码 " + binary);
        System.out.println(num + " 补码 " + complement);
        System.out.println("---------------------------------------------");
        System.out.println(complement + " <<  0 补码 = " + cf(num<<0) +"  ,十进制 "+ (num<<0));
        System.out.println(complement + " << 32 补码 = " + cf(num<<32)  +"  ,十进制 "+ (num<<32));
        System.out.println(complement + " <<  4 补码 = " + cf(num<<4)  +"  ,十进制 "+ (num<<4));
        System.out.println(complement + " << 36 补码 = " + cf(num<<36)  +"  ,十进制 "+ (num<<36));
        System.out.println(complement + " << 24 补码 = " + cf(num<<24)  +"  ,十进制 "+ (num<<24));
        System.out.println(complement + " << 31 补码 = " + cf(num<<31)  +"  ,十进制 "+ (num<<31));
    }

打印结果如下: 

int最小值补码 = 1000_0000_0000_0000_0000_0000_0000_0000
int最大值补码 = 0111_1111_1111_1111_1111_1111_1111_1111
-129 原码 1000_0000_0000_0000_0000_0000_1000_0001
-129 补码 1111_1111_1111_1111_1111_1111_0111_1111
---------------------------------------------
1111_1111_1111_1111_1111_1111_0111_1111 <<  0 补码 = 1111_1111_1111_1111_1111_1111_0111_1111  ,十进制 -129
1111_1111_1111_1111_1111_1111_0111_1111 << 32 补码 = 1111_1111_1111_1111_1111_1111_0111_1111  ,十进制 -129
1111_1111_1111_1111_1111_1111_0111_1111 <<  4 补码 = 1111_1111_1111_1111_1111_0111_1111_0000  ,十进制 -2064
1111_1111_1111_1111_1111_1111_0111_1111 << 36 补码 = 1111_1111_1111_1111_1111_0111_1111_0000  ,十进制 -2064
1111_1111_1111_1111_1111_1111_0111_1111 << 24 补码 = 0111_1111_0000_0000_0000_0000_0000_0000  十2130706432
1111_1111_1111_1111_1111_1111_0111_1111 << 31 补码 = 1000_0000_0000_0000_0000_0000_0000_0000  十-2147483648

三种颜色数字含义:

  • 蓝色:
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值