1. 程式人生 > 實用技巧 >JAVA_邏輯運算子與位運算子使用

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:||| 的結果相同
    • 形同點2:當符號左邊是false時,二者都會執行後面的操作
    • 不同點:當符號左邊時true時,|繼續執行符號右邊的運算,而 ||不在執行符號右邊的操作

位運算子

位運算子操作的都是整型的資料。

位運算子是直接對整數的二進位制進行計算。

運算子 運算 範例
<< 左移 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);