一、位操作符
// & 位与
// | 位或
// ^ 按位异或
// ~ 按位取反
// << 左移
// >> 右移,带符号 正数还是正数, 负数还是负数
// >>> 右移,无符号 正数、负数都变正数
二、代码
public static void main(String[] args) {
int i = 5;
System.out.println(Integer.toBinaryString(i));
// 1: | 位或 每一位进行或运算,任意为1则为1,都为0则为0
int x = 5; // 0b101
int y = 6; // 0b110
// 0b101
// | 0b110
// = 0b111 = 7
System.out.println(x + " | " + y + " = " + (x | y));
// 2: & 位与 每一位进行与运算,任意为0,则为0,都为1则为1
// 0b101
// & 0b110
// = 0b100 = 4
System.out.println(x + " & " + y + " = " + (x & y));
// 3: ^ 异或 不同为1,相同为0
// 0b101
// ^ 0b110
// = 0b011 = 3
System.out.println(x + " ^ " + y + " = " + (x ^ y));
// 4: ^ 异或拓展
// 任意数与自身进行异或 都等于0
System.out.println(x + " ^ " + x + " = " + (x ^ x));
// 任意数与0进行异或 都等于自身
System.out.println(x + " ^ " + 0 + " = " + (x ^ 0));
byte b = 5;
// 5: ~ 取反 0变1,1变0
// ~ 0b00000101
// = 0b11111010 = -6(最高位为1,是负数,减1取反可得到数值6,再加上负号)
System.out.println("~" + x + " = " + (~x));
// 6:<< 左移 右边补0
// 0b110 = 6
// <<1 左移1位
// = 0b1100 = 12
System.out.println(y + " << 1" + " = " + (y << 1));
int j1 = -6;
// 11111111111111111111111111111010 = -6
// <<1 左移1位
// = 11111111111111111111111111110100 = -12
System.out.println(j1 + " << 1" + " = " + (j1 << 1));
// 7:>> 右移 带符号 正数左边补0,负数左边补1
// 0b110 = 6
// >>1 右移1位
// = 0b011 = 3
System.out.println(y + " >> 1" + " = " + (y >> 1)); // 正数还是正数
int j2 = -6;
// 11111111111111111111111111111010 = -6
// >>1 右移1位
// = 11111111111111111111111111111101 = -3
System.out.println(j2 + " >> 1" + " = " + (j2 >> 1)); // 负数还是负数
// 8:>>> 无符号右移 左边补0
int j3 = 6;
// 0b110 = 6
// >>1 右移1位
// = 0b011 = 3
System.out.println(j3 + " >>> 1" + " = " + (j3 >>> 1)); // 正数还是正数
int j4 = -6;
// 11111111111111111111111111111010 = -6
// >>>1 右移1位
// = 01111111111111111111111111111101 = 2147483645
System.out.println(j4 + " >>> 1" + " = " + (j4 >>> 1)); // 负数变正数
}
三、练一练
int aa = 2;
int bb = 3;
System.out.println( (aa | bb) ^ (aa & bb) <<1 >>>1); // ?