public class TestMain {
static final int TOP = 1;
static final int BOTTOM = 1 << 1;
static final int LEFT = 1 << 2;
static final int RIGHT = 1 << 3;
public static void main(String[] args) {
int[] arr = {TOP, BOTTOM, LEFT, RIGHT, LEFT | TOP, LEFT | BOTTOM, RIGHT | TOP, RIGHT | BOTTOM};
for (int i : arr) {
switch (i) {
case TOP:
print("頂部", TOP);
break;
case BOTTOM:
print("底部", BOTTOM);
break;
case LEFT:
print("左邊", LEFT);
break;
case RIGHT:
print("右邊", RIGHT);
break;
case LEFT | TOP:
print("左上角", (LEFT | TOP));
break;
case LEFT | BOTTOM:
print("左下角", (LEFT | BOTTOM));
break;
case RIGHT | TOP:
print("右上角", (RIGHT | TOP));
break;
case RIGHT | BOTTOM:
print("右下角", (RIGHT | BOTTOM));
break;
}
}
}
public static void print(String string, int value) {
System.out.println(string + ": " + Integer.toBinaryString(value));
}
}
------------
頂部: 1
底部: 10
左邊: 100
右邊: 1000
左上角: 101
左下角: 110
右上角: 1001
右下角: 1010
通過 |= 實現(xiàn)多狀態(tài),
000100 或運算
001000 得到
001100 這時就有了兩個狀態(tài)
通過 & 的結(jié)果來判斷是否有狀態(tài)值
位操作是程序設(shè)計中對位模式或二進制數(shù)的一元和二元操作。主要包括按位與(&)、按位或(|)、按位異或(^)哨坪、取反(~)、左移(<<)乍楚、右移(>>)
位運算符
取反(NOT)
取反是一元運算符当编,對一個二進制數(shù)的每一位執(zhí)行邏輯反操作。使數(shù)字1成為0徒溪,0成為1
NOT 0111(十進制7)
= 1000(十進制8)
許多程序設(shè)計語言忿偷,取反操作符用波浪線"~"表示。值得注意的是此操作符與"邏輯非(!)"操作符不同臊泌。"邏輯非"并不是一個位操作鲤桥。
按位或(OR)
按位或處理兩個長度相同的二進制數(shù),兩個相應(yīng)的二進位中只要有一個為1渠概,該位的結(jié)果值為1
0101(十進制5)
OR 0011(十進制3)
= 0111(十進制7)
在C類程序設(shè)計語言中茶凳,按位或操作符是"|"。這一操作符需要與邏輯或運算符(||)區(qū)別開來
按位或能夠?qū)⒚恳晃豢醋銎鞄酶叩辉诙M制數(shù)中的每一位可以表示不同的布爾變量慧妄。應(yīng)用按位或操作可以將二進制數(shù)的某一位設(shè)為1。例如
0010(十進制2)
能夠看做包含4個旗幟的組合剪芍。第1塞淹,2,4旗幟為0罪裹;第3個旗幟為1饱普。利用按位或可以將第1個旗幟設(shè)置為1,而其他旗幟不變状共。
0010(十進制2)
OR 1000(十進制8)
= 1010(十進制10)
這一技巧通常用來保存程序中的大量布爾變量套耕。
按位異或(XOR)
按位異或運算,對等長二進制模式或二進制數(shù)的每一位執(zhí)行邏輯異或操作峡继。操作的結(jié)果是如果某位不同則該位為1冯袍,否則該位為0。例如
0101
XOR 0011
= 0110
在類C語言中,按位異或運算符是"^"康愤。
匯編語言的程序員們有時使用按位異或運算作為將寄存器的值設(shè)為0的捷徑儡循。用值的自身對其執(zhí)行按位異或運算將得到0。并且在許多架構(gòu)中征冷,與直接加載0值并將它保存到寄存器相比择膝,按位異或運算需要較少的中央處理單元時鐘周期。
按位異或也可以用于在比特集合中切換旗幟检激。給出一個模式肴捉,
0010
第一和第三位能夠通過按位異或運算使用同時切換。
0010
XOR 1010
= 1000
這一技巧可用于操作表示布爾變量的比特模式叔收。
按位與(AND)
按位與處理兩個長度相同的二進制數(shù)齿穗,兩個相應(yīng)的二進位都為1,該位的結(jié)果值才為1今穿,否則為0缤灵。例如:
0101
AND 0011
= 0001
在類C語言中,按位與用'&'表示
移位
移位是一個二元運算符蓝晒,用來將一個二進制數(shù)中的每一位全部都向一個方向移動指定位腮出,溢出的部分將被舍棄,而空缺的部分填入一定的值芝薇。在類C語言中胚嘲,左移使用兩個小于符號"<<"表示,右移使用兩個大于符號">>"表示洛二。
應(yīng)用邏輯移位時馋劈,移位后空缺的部分全部填0。
0001(十進制1)
<< 3(左移3位)
= 1000(十進制8)
1010(十進制10)
>> 2(右移2位)
= 0010(十進制2)
JAVA中有一個特有的無符號右移操作符“>>>”晾嘶。此操作將忽略操作數(shù)的符號妓雾,同樣的還有“>>>=”。
Reference
https://www.wikiwand.com/zh/%E4%BD%8D%E6%93%8D%E4%BD%9C
更多
獲取優(yōu)秀工具垒迂,請關(guān)注微信公眾號獲取