JAVA_邏輯運算子與位運算子使用
阿新 • • 發佈:2020-12-09
邏輯運算子
- &-----邏輯與 | ----- 邏輯或 ! ----- 邏輯非
- &&-----短路與 || ----- 斷路或 ^ ----- 邏輯異或
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 = 7 |
^ |
異或運算 | 6 ^ 3 = 5 |
~ |
取反運算 | ~ 6 = -7 |
- 注意:沒有
<<<
無符號左移
位運算子的細節 | |
---|---|
<< |
空位補0,被移除的高位丟棄,空缺位補0。 |
>> |
被移位的二進位制最高位是0,右移後,空缺位補0;最高位如果是1,則空缺位補1。 |
>>> |
被移位二進位制最高位無論是0或者是1,空缺位都補0。 |
& |
二進位制位進行& 運算,只有1 & 1時結果是1,否則是0。 |
| |
二進位制位進行| 運算,只有0| 0時結果是0,否則是1。 |
^ |
相同二進位制位進行^ 運算,結果是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);