java中逻辑移位与算数移位的区别
一、区别
符号位也跟着移动,算数移位溢出截断,高位,低位补零,符号位按照正负数来补,逻辑移位符号位补0
算数移位
- 算数左移<<:
溢出截断,低位补零,正数符号位补零,复数补一 - 算数右移>>:
正数:溢出截断,高位补零
负数:溢出截断,高位补一
逻辑移位
- 逻辑右移>>>:
溢出丢弃,高位补零,符号位补零
二、原码,反码,补码基础
机器数在计算机中以补码的形式存在
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代表移动的位数)
逻辑右移:对于正数结果与算术右移相同,负数结果差据很大。(所以逻辑右移运算符存在的意义是什么)