逻辑运算符
- &-----逻辑与 | ----- 逻辑或 ! ----- 逻辑非
- &&-----短路与 || ----- 断路或 ^ ----- 逻辑异或
a | b | a & b | a && b | a | b | a || b | !a | a ^ b |
true | true | true | true | true | true | false | false |
true | false | false | false | true | true | false | true |
false | true | false | false | true | true | true | true |
false | false | false | false | false | false | true | false |
- 区分
&
与&&
- 相同点1:
&
与&&
的运算结果相同 - 相同点2:当符号左边是
true
时,二者都会执行符号右边的运算 - 不同点:当符号左边是
false
时,&
继续执行符号右边的运算。而&&
不再执行符号右边的
- 区分
|
与||
- 相同点1:
|
与||
的结果相同 - 形同点2:当符号左边是
false
时,二者都会执行后面的操作 - 不同点:当符号左边时
true
时,|
继续执行符号右边的运算,而||
不在执行符号右边的操作
位运算符
位运算符操作的都是整型的数据。
位运算符是直接对整数的二进制进行计算。
运算符 | 运算 | 范例 |
| 左移 |
|
| 右移 | 3 |
| 无符号右移 | 3 |
| 与运算 | 6 |
| 或运算 | 6 |
| 异或运算 | 6 |
| 取反运算 |
|
- 注意:没有
<<<
无符号左移
位运算符的细节 | |
| 空位补0,被移除的高位丢弃,空缺位补0。 |
| 被移位的二进制最高位是0,右移后,空缺位补0;最高位如果是1,则空缺位补1。 |
| 被移位二进制最高位无论是0或者是1,空缺位都补0。 |
| 二进制位进行 |
| 二进制位进行 |
| 相同二进制位进行 不相同二进制位 |
| 正数取反,各二进制码按补码各位取反 负数取反,各二进制码按补码各位取反 |
<<
:在一定范围内,每项左移1位,相当于 *
2
>>
: 在一定范围内,每项右移1位,相当于 /
2
public class BitTest {
public static void main(String[] args) {
int i = 21;
int j = -21;
System.out.println(" j << 2 = " + ( j << 2 )); // -21 * 2 * 2 = -84
System.out.println(" i << 2 = " + ( i << 2 )); // 21 * 2 * 2 = 84
System.out.println(" i << 3 = " + ( i << 3 )); // 21 * 2 * 2 * 2 = 168
System.out.println(" j >> 2 = " + ( j >> 2 )); // -21 / 2 / 2 = -6
System.out.println(" i >> 2 = " + ( i >> 2 )); // 21 / 2 / 2 = 5
System.out.println(" i >> 3 = " + ( i >> 3 )); // 21 / 2 / 2 / 2 = 2
int m = 12;
int n = 5;
System.out.println(" m & n = " + ( m & n )); // 4
System.out.println(" m | n = " + ( m | n )); // 13
System.out.println(" m ^ n = " + ( m ^ n )); // 9
}
}
数值之间的交换:
// 交换两个变量的值
int num1 = 10;
int num2 = 20;
System.out.println(" num1 = " + num1 + " ,num2 = " + num2);
// 方法一:推荐以定义临时变量的方式进行交换
// 好处:适用于多种类型
int temp = num1;
num1 = num2;
num2 = temp;
System.out.println(" num1 = " + num1 + " ,num2 = " + num2);
// 方法二:
// 好处:不用定义临时变量
// 弊端:①相加操作可能超出存储范围②有局限性:只针对数值类型
int num3 = 10;
int num4 = 20;
num3 = num3 + num4; // num3 = 30;
num4 = num3 - num4; // num4 = 10;
num3 = num3 - num4; // num3 = 20;
System.out.println(" num3 = " + num3 + " ,num4 = " + num4);
// 方法三:实用位运算符
// 好处:不用定义临时变量
// 弊端:有局限性:只针对数值类型
int num5 = 10;
int num6 = 20;
num5 = num5 ^ num6;
num6 = num5 ^ num6;
num5 = num5 ^ num6;
System.out.println(" num5 = " + num5 + " ,num6 = " + num6);