JAVA_基础逻辑运算符与位运算符使用
逻辑运算符
- &-----逻辑与 | ----- 逻辑或 ! ----- 逻辑非
- &&-----短路与 || ----- 断路或 ^ ----- 逻辑异或
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:
-
区分
|
与||
- 相同点1:
|
与||
的结果相同 - 形同点2:当符号左边是
false
时,二者都会执行后面的操作 - 不同点:当符号左边时
true
时,|
继续执行符号右边的运算,而||
不在执行符号右边的操作
- 相同点1:
位运算符
位运算符操作的都是整型的数据。
位运算符是直接对整数的二进制进行计算。
运算符 | 运算 | 范例 |
---|---|---|
<< |
左移 | 3 << 2 = 12 ( 3 * 2 * 2 = 12 ) |
>> |
右移 | 3 >> 1 = 1 ( 3 / 2 = 1 ) |
>>> |
无符号右移 | 3 >>> 1 = 1 ( 3 / 2 = 1 ) |
& |
与运算 | 6 & 3 = 2 |
` | ` | 或运算 |
^ |
异或运算 | 6 ^ 3 = 5 |
~ |
取反运算 | ~ 6 = -7 |
- 注意:没有
<<<
无符号左移
位运算符的细节 | |
---|---|
<< |
空位补0,被移除的高位丢弃,空缺位补0。 |
>> |
被移位的二进制最高位是0,右移后,空缺位补0;最高位如果是1,则空缺位补1。 |
>>> |
被移位二进制最高位无论是0或者是1,空缺位都补0。 |
& |
二进制位进行& 运算,只有1 & 1时结果是1,否则是0。 |
` | ` |
^ |
相同二进制位进行^ 运算,结果是0;( 1 ^ 1 = 0, 0 ^ 0 = 0 )不相同二进制位 ^ 运算结果是1。( 1 ^ 0 = 1, 0 ^ 1 = 1 ) |
~ |
正数取反,各二进制码按补码各位取反 负数取反,各二进制码按补码各位取反 |
<<
:在一定范围内,每项左移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);