# 位运算操作符
位运算在Java中有四种,”与”,”或”,”非”,”异或”。看名字前三个我们应该已经大概知道是干嘛的了。异或的概念在这里说一下就好了。异或:两个输入相同时为0,不同则为1。来几个demo吧
与
真值表
a | b | a&b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
public static void andOpt() {
int a = 4;
int b = 7;
System.out.println("a的二进制为:" + Integer.toBinaryString(a));
//100
System.out.println("b的二进制为:" + Integer.toBinaryString(b));
//111
System.out.println("a&b的二进制为:" + Integer.toBinaryString(a & b));
//100
}
或
真值表
a | b | a&b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
public static void orOpt() {
int a = 4;
int b = 7;
System.out.println("a的二进制为:" + Integer.toBinaryString(a));
//100
System.out.println("b的二进制为:" + Integer.toBinaryString(b));
//111
System.out.println("a|b的二进制为:" + Integer.toBinaryString(a | b));
//111
}
非
真值表
a | ~a |
---|---|
0 | 1 |
1 | 0 |
public static void notOpt() {
int a = 4;
System.out.println("a的二进制为:" + Integer.toBinaryString(a));
//100
System.out.println("~a的二进制为:" + Integer.toBinaryString(~a));
//1111 1111 1111 1111 1111 1111 1111 1011
}
在这里说明一下,为什么非的结果是这么多1。因为int在Java中是占有32位
即4的话应该是: 0000 0000 0000 0000 0000 0000 0000 0100
取非之后应该是:1111 1111 1111 1111 1111 1111 1111 1011
异或
真值表
a | b | a&b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
public static void andOpt() {
int a = 4;
int b = 7;
System.out.println("a的二进制为:" + Integer.toBinaryString(a));//100
System.out.println("b的二进制为:" + Integer.toBinaryString(b));//111
System.out.println("a^b的二进制为:" + Integer.toBinaryString(a ^ b));//011
}
其实还有一个同或的概念,相同为1,不同为零
真值表
a | b | a&b |
---|---|---|
0 | 0 | 1 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
左移和右移以及无符号右移
左移和右移的操作是指将这个数字转成二进制,进行移位的操作,如1左移两位,即001 -> 100,即1->4
4右移两位,即100->001 ,即1
public static void goRight() {
int a = 1 << 2;
System.out.println("1左移两位后:" + a);//4
}
public static void goLeft() {
int a = 4 >> 2;
System.out.println("4右移两位后:" + a);//1
}
计算机负数用补码表示,会把最高位当做符号位。有符号右移则判断符号位,正数则左边填零,负数则左边填一。无符号右移是指不管符号位,都往左边填零。我们可以看一下例子:
public static void goRightWithOutSym() {
int a = -5;
System.out.println("-5的二进制为: " + Integer.toBinaryString(a));
//1111 1111 1111 1111 1111 1111 1111 1011
System.out.println("-5右移两位: " + Integer.toBinaryString(a >> 4));
//1111 1111 1111 1111 1111 1111 1111 1111
System.out.println("-5无符号右移两位: " + Integer.toBinaryString(a >>> 4));
//0000 1111 1111 1111 1111 1111 1111 1111
int b = 5;
System.out.println("5的二进制为: " + Integer.toBinaryString(b));
//101
System.out.println("5右移两位: " + Integer.toBinaryString(b >> 1));
//010
System.out.println("5无符号右移两位: " + Integer.toBinaryString(b >>> 1));
//010
}
这里就有涉及计到了补码的相关知识