>>,>>>与<<
先上结论:
>> :右移,正数右移,高位补0,负数右移,高位补1
>>>:右移,高位补0,不区分正数负数
<<:左移,低位补0,不区分正数负数
注:1.左移右移符号位也一起移动
2.高位低位补1/0是指:移动完后空出来的位全部补1/0
3.不存在<<<这个运算符
对于正数来说,>>与>>>是一样的,均为右移高位补0
对于负数来说,>>与>>>是不一样的,>>右移高位补1,>>>右移高位补0
要实现左移乘与右移除的话,用>>与<<即可
负数用>>>会变成正数,不知道这个>>>有啥用。。。
接下来是以上结论的代码验证。
>>,>>>,<<代码验证
测试代码:
@Test
public void test() {
int a = 0b10011111111111111111111111111111;//不用数了,这里是32位
int b = a>>2;
int c = a>>>2;
int d = a<<2;
System.out.println("a的值为:"+a);
System.out.println("a的二进制表示:" + Integer.toBinaryString(a));
System.out.println("a>>2的值为:"+b);
System.out.println("a>>2的二进制表示:" + Integer.toBinaryString(b));
System.out.println("a>>>2的值为:"+c);
System.out.println("a>>>2的二进制表示:" + Integer.toBinaryString(c));
System.out.println("a<<2的值为:"+d);
System.out.println("a<<2的二进制表示:" + Integer.toBinaryString(d));
}
输出为:
a的值为:-1610612737
a的二进制表示:10011111111111111111111111111111(32位)
a>>2的值为:-402653185
a>>2的二进制表示:11100111111111111111111111111111(32位)
a>>>2的值为:671088639
a>>>2的二进制表示:100111111111111111111111111111(30位)
a<<2的值为:2147483644
a<<2的二进制表示:1111111111111111111111111111100(31位)
int是32位,但是显示的时候是从第一个1开始显示的
所以a>>>2只显示30位,a<<2只显示31位
测试代码:
@Test
public void test() {
int a = -16;
int b = a>>2;
int c = a>>>2;
int d = a<<2;
System.out.println("a的值为:"+a);
System.out.println("a>>2的值为:"+b);
System.out.println("a>>>2的值为:"+c);
System.out.println("a<<2的值为:"+d);
}
输出为:
a的值为:-16
a>>2的值为:-4
a>>>2的值为:1073741820
a<<2的值为:-64
原码,反码,补码回顾:
- 正数:原码=反码=补码
- 负数:原码;反码=原码除符号位外取反;补码=反码+1=原码除符号位外取反+1
注:补码的补码=原码,即符号位不变,其余位取反+1
例:-20
原码:1001 0100
反码:1110 1011
补码:1110 1100
补码的补码:1001 0011+1 =1001 0100
Java中赋值回顾:
Java中除了十进制赋值外,还有二进制赋值,八进制赋值,十六进制赋值
测试代码:
@Test
public void test() {
int a = 10;//十进制赋值
int b = 0b1010;//二进制赋值
int c = 012;//八进制赋值
int d = 0xa;//十六进制赋值
System.out.println("a = " + a);
System.out.println("b = " + b);
System.out.println("c = " + c);
System.out.println("d = " + d);
}
输出为:
a = 10
b = 10
c = 10
d = 10
总结:
二进制赋值:前面加0b;
八进制赋值:前面加0;
十六进制赋值:前面加0x;