https://java-er.com/blog/java-shit-operation/
Java位運算符(bitwise operators),應用于整數(shù)類型(int),長整型(long),短整型(short),字符型(char),和字節(jié)型(byte)。
位運算符作用在所有的位上,并且按位運算。假設a = 5,b = 12;它們的二進制格式表示將如下:
A = 0101
B = 1100
-----------------
A&B = 0100
A | B = 1101
A ^ B = 1001
~A= 1010
操作符描述例子
&如果相對應位都是1,則結果為1,否則為0a & b = 4 即100
|如果相對應位都是 0,則結果為 0,否則為 1a | b = 13 即1101
^如果相對應位值相同,則結果為0,否則為1a ^ b = 9 即1001
?按位取反運算符翻轉操作數(shù)的每一位,即0變成1,1變成0。~a = -6 即1010
<<?按位左移運算符。左操作數(shù)按位左移右操作數(shù)指定的位數(shù)。a << 2 = 20 即10100
>>?按位右移運算符。左操作數(shù)按位右移右操作數(shù)指定的位數(shù)。a >> 2 = 1 即1
>>>?按位右移補零操作符。左操作數(shù)的值按右操作數(shù)指定的位數(shù)右移,移動得到的空位以零填充。a >>> 2 = 1 即1
位移說明
A << 2 表示A 向左邊移動2位
A = 0101
計算機的前面其實還有很多0
所以 表示如下
位移前:A? = 0000 0101
位移后:A? = 0001 0100
當A >> 2 向右邊移動的時候,后面沒有空間了。所以砍掉
位移前:A? = 0000 0101
位移后:A? = 0000 0001
Java測試代碼
int a = 5;
int b = 12;
System.out.println("a 的二進制:" + Integer.toBinaryString(a));
System.out.println("b 的二進制:" + Integer.toBinaryString(b));
int c = 0;
c = a & b;? ? ?
System.out.println("a & b = " + c +" 即"+Integer.toBinaryString(c));
c = a | b;? ? ?
System.out.println("a | b = " + c +" 即"+Integer.toBinaryString(c));
c = a ^ b;? ? ?
System.out.println("a ^ b = " + c +" 即"+Integer.toBinaryString(c));
c = ~a;? ? ? ? ?
System.out.println("~a = " + c +" 即"+Integer.toBinaryString(c));
c = a << 2;? ?
System.out.println("a << 2 = " + c +" 即"+Integer.toBinaryString(c));
c = a >> 2;? ?
System.out.println("a >> 2? = " + c+" 即"+Integer.toBinaryString(c) );
c = a >>> 2;? ?
System.out.println("a >>> 2 = " + c+" 即"+Integer.toBinaryString(c) );
輸出
a 的二進制:101
b 的二進制:1100
a & b = 4 即100
a | b = 13 即1101
a ^ b = 9 即1001
~a = -6 即11111111111111111111111111111010
a << 2 = 20 即10100
a >> 2? = 1 即1
a >>> 2 = 1 即1
復合位賦值運算符
運算符含義實例結果
&=按位與賦值a &= b等價于?a=a & b
|=按位或賦值a |= b等價于?a=a | b
^=按位異或賦值a ^= b等價于?a=a ^?b
-=按位取反賦值a?~= b等價于?a=a ~ b
?=按位左移賦值a ?= b等價于?a=a ? b
?=按位右移賦值a??= b等價于?a=a ? b