java之>> 与>>>的区别

java中逻辑移位与算数移位的区别

一、区别

符号位也跟着移动,算数移位溢出截断,高位,低位补零,符号位按照正负数来补,逻辑移位符号位补0

算数移位

  1. 算数左移<<:
    溢出截断,低位补零,正数符号位补零,复数补一
  2. 算数右移>>:
    正数:溢出截断,高位补零
    负数:溢出截断,高位补一

逻辑移位

  1. 逻辑右移>>>:
    溢出丢弃,高位补零,符号位补零

二、原码,反码,补码基础

机器数在计算机中以补码的形式存在

        int j = -4;
        String s = Integer.toBinaryString(j);
        System.out.println(s);
        ##输出结果为
        11111111111111111111111111111100

int类型占4个字节(一共32位),第一位表示符号位,其它位为数值为。那么它最大能表示2^31 -1(即2147483647),最小能表示-2^31(即-2147483648)

三、例子

如果对char、byte、short类型移位,则在移位前,它们会被转成int类型,且返回值也是int类型;如果对long类型移位,则返回值也是long。

算数左移

        byte i = -4 << 1;
        System.out.println(i);
        int j = 8 << 2;
        System.out.println(j);
        #输出结果
        #i为-8
		#j为32

对于-4
补码为:1111 1111 1111 1111 1111 1111 1111 1100
溢出截断,低位补零,正数符号位补零,复数补一
补码左移结果为1111 1111 1111 1111 1111 1111 1111 1000
正数的原码补码反码都一样,负数的反码为对该数的原码除符号位不变,其余位取反
负数补码转原码为,源码转补码一样:符号位不变,各位取反,末尾加一
转换为原码为1000 0000 0000 0000 0000 0000 0000 1000转为十进制为-2^3 = -8
对于8
补码为:0000 0000 0000 0000 0000 0000 0000 1000
溢出截断,低位补零,正数符号位补零,复数补一
补码左移结果为:0000 0000 0000 0000 0000 0000 0010 0000
转换为原码:0000 0000 0000 0000 0000 0000 0010 0000
转换为十进制:+2^5 = 32

算数右移

        byte i = -4 >> 2;
        System.out.println(i); // -1
        int j = 8 >> 2;
        System.out.println(j);// 2
       

对于-4
补码为:1111 1111 1111 1111 1111 1111 1111 1100
溢出截断,高位补一
移位补码结果:1111 1111 1111 1111 1111 1111 1111 1111
原码为:1000 0000 0000 0000 0000 0000 0000 0001
十进制为:-1
对于8
补码为:0000 0000 0000 0000 0000 0000 0000 1000
溢出截断,高位补零
移位补码结果为:0000 0000 0000 0000 0000 0000 0000 0010
原码为:0000 0000 0000 0000 0000 0000 0000 0010
十进制:2

逻辑右移

        int i = -4 >>> 2;
        System.out.println(i); // 1073741823
        int j = 8 >>> 2;
        System.out.println(j); // 2
        int l = -5 >>> 2;
        System.out.println(l); // 1073741822

对于-4
补码为:1111 1111 1111 1111 1111 1111 1111 1100
溢出丢弃,高位补零,符号位补零
逻辑右移补码结果:0011 1111 1111 1111 1111 1111 1111 1111
原码:0011 1111 1111 1111 1111 1111 1111 1111
十进制:2^30 -1 = 1073741823
对于8
补码为:0000 0000 0000 0000 0000 0000 0000 1000
溢出丢弃,高位补零,符号位补零
移位补码结果:0000 0000 0000 0000 0000 0000 0000 0010
原码:0000 0000 0000 0000 0000 0000 0000 0010
十进制:2
对于-5
补码为:1111 1111 1111 1111 1111 1111 1111 1011
移位补码为:0011 1111 1111 1111 1111 1111 1111 1110
原码:0011 1111 1111 1111 1111 1111 1111 1110
十进制:2^30-1-1 = 1073741822

总结

(对于能够被2整除的数)
算术左移:相当于乘以2^n,(n代表移动的位数)
算术右移:相当于除以2^n,(n代表移动的位数)
逻辑右移:对于正数结果与算术右移相同,负数结果差据很大。(所以逻辑右移运算符存在的意义是什么)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值