位运算符“<<”,“>>”,“>>>”的区别。
1.左移"<<",无论是正数还是负数,低位都补0。
byte a = 11; byte b = -11; System.out.println("a = "+(a << 2)); System.out.println("b = "+(b << 2));
(byte为1个字节)
正数:11
原码:0000 1011
左移:0010 1100
结果:44
负数:-11
原码:1000 1011
反码:1111 0100
补码: 1111 0101
左移: 1101 0100
补码的补码(原码):1010 1100
结果:-44
2.右移:“>>”,正数高位补0,负数高位补1.
byte a = 13; byte b = -13; System.out.println("a = "+(a >> 2)); System.out.println("b = "+(b >> 2));
正数:13
原码: 0000 1101
右移: 0000 0011
结果: 3
负数:-13
原码:1000 1101
反码: 1111 0010
补码: 1111 0011
右移: 1111 1100
补码的补码:1000 0100
结果:-4
3.右移 “>>>”。为无符号右移,无论该数为正还是为负高位都为0.
int a = 13; int b = -13; System.out.println("a = "+(a >>> 2)); System.out.println("b = "+(b >>> 2));
正数:13
原码:00000000 00000000 00000000 00001101
右移:00000000 00000000 00000000 00000011
结果为:3
负数:-13(这个补码右移完后就是结果,不要再求补码)
原码:10000000 00000000 00000000 00001101
反码:11111111 11111111 11111111 11110010
补码: 11111111 11111111 11111111 11110011
右移: 00111111 11111111 11111111 11111100
结果:1073741820