1. 程式人生 > >Java位運算應用

Java位運算應用

常見的位運算包括:與(&)、或(|)、非(~)、異或(^)、左位移(<<)、右位移(>>或>>>)

  • 與運算:運算子兩邊運算元同為1時結果為1,否則為0。例:1010 & 1100 = 1000,多位運算時按位與;
  • 或運算:運算子兩邊運算元同為0時結果為0,否則為1。例:1010 | 1100 = 1110,多位運算同上;
  • 非運算:對運算子右邊的運算元按位取反,1變0,0變1。例:~1010 = 0101
  • 異或運算:運算子兩邊運算元按位同為1或0時結果為0,不同時為1。例:1010^1100 = 0110
  • 左位移運算:左丟棄最高位,0補最低位。例:1010<<2 = 1000,丟棄前兩位10,低位補0;
  • 右位移運算:(>>)"有符號"右移,符號為正,高位補0,符號為負高位補1。(>>>)"無符號"右移,無論正負,高位補0;

與或運算應用

包含關係判斷

定義:
    /** 0000 */
    private static final int FLAG_ONE = 0x1;
    /** 0010 */
    private static final int FLAG_TWO = 0x2;
    /** 0100 */
    private static final int FLAG_FOUR = 0x4;
    /** 1000 */
    private static final int FLAG_EIGHT = 0x8;

    /** 1000 */
    private static int TARGET1 = FLAG_ONE | FLAG_EIGHT;
    
    /** 1010 */
    private static int TARGET2 = FLAG_ONE | FLAG_TWO | FLAG_EIGHT;
  1. FLAG_ONE、FLAG_TWO、FLAG_FOUR、FLAG_EIGHT 二進位制的值分別為0000、0010、0100、1000
  2. TARGET1與TARGET2為或運算結果
測試方法:
    private static void test1() {
        int result1 = TARGET1 & FLAG_ONE;
        System.out.println("result1 = " + result1);
        int result2 = TARGET1 & FLAG_TWO;
        System.out.println("result2 = " + result2);
        int result4 = TARGET1 & FLAG_FOUR;
        System.out.println("result4 = " + result4);
        int result8 = TARGET1 & FLAG_EIGHT;
        System.out.println("result8 = " + result8);
    }

result1、result2、result4、result8結果表示了TARGET1與四個FLAG值的與運算

結果驗證位:
    result1 = 1
    result2 = 0
    result4 = 0
    result8 = 8

TARGET1是FLAG_ONE與FLAG_EIGHT的或運算結果,所以對應的result1、result8都不為0

原理:
    1111 | 0000 = 1111
    1111 & 0000 = 0000
    1111 & 1111 = 1111
    
    1010 | 0101 = 1111
    1111 & 1010 = 1010
    1111 & 0101 = 0101
    
    a | b = c
    c & a = a
    c & b = b

異或運算應用

變數值交換

測試方法:
    private static void test3() {
        int var1 = FLAG_ONE;
        int var2 = FLAG_TWO;
        System.out.println("var1 = " + var1 + "; var2 = " + var2);
        // 交換var1和var2的值
        var1 = var1 ^ var2;
        // a ^ a = 0
        // b = (a ^ b) ^ b = a ^ (b ^ b) = a ^ 0 = a
        var2 = var1 ^ var2;
        // a = a ^ (a ^ b) = (a ^ a) ^ b = 0 ^ b = b
        var1 = var2 ^ var1;
        System.out.println("==========swicth===========");
        System.out.println("var1 = " + var1 + "; var2 = " + var2);
    }
原理:
    a ^ a = 0
    a ^ 0 = a