// 00000000 00000000 00000000 00000011 3的二进制原码 00000000 00000000 00000000 00000010 2的二进制原码
// 00000000 00000000 00000000 00000011 3的二进制反码 00000000 00000000 00000000 00000010 2的二进制反码
// 00000000 00000000 00000000 00000011 3的二进制补码 00000000 00000000 00000000 00000010 2的二进制补码
// &(与位运算)
System.out.println(3 & 2);
// 00000011
// & 0为false,1为true
// 00000010
// --------
// 00000010 --- 转换为十进制:2
// |(或位运算)
System.out.println(3 | 2);
// 00000011
// | 0为false,1为true
// 00000010
// --------
// 00000011 --- 转换为十进制:3
// ^(异或位运算)
System.out.println(3 ^ 2);
// 00000011
// ^ 0为false,1为true
// 00000010
// --------
// 00000001 --- 转换为十进制:1
// ~(按位运算)
System.out.println(~3);
// 00000011 3的二进制补码
// ~
// 11111100 3的按位取反二进制补码
// 11111011 3的按位取反二进制反码
// 10000100 3的按位取反二进制原码 --- 转换为十进制:-4
// >>(右移位运算)
System.out.println(3 >> 2);
// 00000011 3的二进制补码
// >> 2
// 00000000 --- 转换为十进制:0
// <<(左移位运算)
System.out.println(3 << 2);
// 00000011 3的二进制补码
// << 2
// 00001100 --- 转换为十进制:12
// >>>(无符号右移位运算)
System.out.println(-3 >>> 2);
// 10000000 00000000 00000000 00000011 3的二进制原码
// 11111111 11111111 11111111 11111100 3的二进制反码
// 11111111 11111111 11111111 11111101 3的二进制补码
// >>> 2
// 00111111 11111111 11111111 11111111 --- 转换为十进制:1073741823
“>>” 和 “>>>” 的区别:
- " >>" 右移运算符(带符号右移):在右移操作时,保留符号位,并用符号位进行填充。如果原始数是正数,则在左侧填充0;如果原始数是负数,则在左侧填充1。
- “>>>” 无符号右移运算符:在右移操作时,将符号位视为普通位,不保留符号位。无论原始数是正数还是负数,都在左侧填充0。