总结
- java int 32位 4字节
- 正数换算成二进制后的高位补0,负数的二进制高位补1
- 右移相当于除以2取整
- 左移相当于乘以2
- 负数的二进制表示为其正数的二进制的补码
- 补码=反码+1
- 负数无符号右移,高位也是补0,负数变成正数
- 按位异或 相同为0,不同为1
相关验证
public class BitOperator {
public static void main(String[] args) {
//java int 32位 4字节
//正数换算成二进制后的高位补0,负数的二进制高位补1
// 0000 0000 0000 0000 0000 0000 0000 0001
//=> 0000 0000 0000 0000 0000 0000 0000 0000
// 正数右移高位补0
//output:0
System.out.println(1 >> 1);
// 0000 0000 0000 0000 0000 0000 0000 0001
//=> 0000 0000 0000 0000 0000 0000 0000 0010
//左移相当于乘以2
// 正数左移低位补0
//output:2
System.out.println(1 << 1);
// 0000 0000 0000 0000 0000 0000 0000 0100
//=> 0000 0000 0000 0000 0000 0000 0000 0010
//右移相当于除以2
//output:2
System.out.println(4 >> 1);
// 无符号右移 高位补0
// 0000 0000 0000 0000 0000 0000 0000 0001
//=> 0000 0000 0000 0000 0000 0000 0000 0000
//output:0
System.out.println(1>>>1);
//负数的二进制表示为其正数的二进制的补码
//补码=反码+1
//所以-1的二进制表示为
//0000 0000 0000 0000 0000 0000 0000 0001 (1的原码) => 1111 1111 1111 1111 1111 1111 1111 1110(1的反码)+1 => 1111 1111 1111 1111 1111 1111 1111 1111
//负数的二进制高位为1
// 1111 1111 1111 1111 1111 1111 1111 1111
//=> 1111 1111 1111 1111 1111 1111 1111 1111
//output:-1
System.out.println(-1 >> 1);
// 1111 1111 1111 1111 1111 1111 1111 1111
//=> 1111 1111 1111 1111 1111 1111 1111 1111
//output:-1
System.out.println(-1 >> 2);
//-5的二进制表示
//0000 0000 0000 0000 0000 0000 0000 0101 (5的原码) => 1111 1111 1111 1111 1111 1111 1111 1010(5的反码)+1 => 1111 1111 1111 1111 1111 1111 1111 1011
// 1111 1111 1111 1111 1111 1111 1111 1011
//=> 1111 1111 1111 1111 1111 1111 1111 1101
//output:-3
System.out.println(-5 >> 1);
//负数无符号右移,高位也是补0,负数变成正数
// 1111 1111 1111 1111 1111 1111 1111 1111
//=> 0111 1111 1111 1111 1111 1111 1111 1111
//output:2147483647
System.out.println(-1>>>1);
//& 按位与
// 0000 0000 0000 0000 0000 0000 0000 0001 & 0000 0000 0000 0000 0000 0000 0000 0011
//=> 0000 0000 0000 0000 0000 0000 0000 0001
//output:1
System.out.println(1&3);
//| 按位或
// 0000 0000 0000 0000 0000 0000 0000 0001 | 0000 0000 0000 0000 0000 0000 0000 0011
//=> 0000 0000 0000 0000 0000 0000 0000 0011
//output:3
System.out.println(1|3);
//^ 按位异或 相同为0,不同为1
// 0000 0000 0000 0000 0000 0000 0000 0001 ^ 0000 0000 0000 0000 0000 0000 0000 0011
//=> 0000 0000 0000 0000 0000 0000 0000 0010
//output:2
System.out.println(1^3);
//~ 按位取非
// ~0000 0000 0000 0000 0000 0000 0000 0001
// 1111 1111 1111 1111 1111 1111 1111 1110
//output:-2
System.out.println(~1);
}
}
//output
0
2
2
0
-1
-1
-3
2147483647
1
3
2
-2