Java位運算應用
阿新 • • 發佈:2018-12-10
常見的位運算包括:與(&)、或(|)、非(~)、異或(^)、左位移(<<)、右位移(>>或>>>)
- 與運算:運算子兩邊運算元同為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;
- FLAG_ONE、FLAG_TWO、FLAG_FOUR、FLAG_EIGHT 二進位制的值分別為0000、0010、0100、1000
- 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