&(按位與運算符)
&(按位與)的運算規則是將兩邊的數轉換為二進制位,然后運算最終值,運算規則即(兩個為真才為真)1&1=1 , 1&0=0 , 0&1=0 , 0&0=0
// 按位與
int i = 3 & 5;
System.out.println(i); // 1
3的二進制為0000 0011,5的二進制為0000 0101,那么就是011&101=001,最終值為0000 0001=1
|(按位或運算符)
|(按位或)和&(按位與)計算方式都是轉換二進制再計算,不同的是運算規則(一個為真即為真)1|0 = 1 , 1|1 = 1 , 0|0 = 0 , 0|1 = 1
// 按位或
i = 3 | 5;
System.out.println(i); // 7
3的二進制為0000 0011,5的二進制為0000 0101,那么就是011 | 101=111,最終值為0000 0111=7
^(異或運算符)
(異或)運算符顧名思義,異就是不同,其運算規則為10 = 1 , 1^1 = 0 , 0^1 = 1 , 0^0 = 0
// 異或
i = 3 ^ 5;
System.out.println(i); // 6
3的二進制為0000 0011,5的二進制為0000 0101,那么就是011 ^ 101=111,最終值為0000 0110=6
<<(左移運算符)
左移運算是將一個二進制位的操作數按指定移動的位數向左移位,移出位被丟棄,右邊的空位一律補0
// 左移
i = 10 << 2;
System.out.println(i); // 40
10<<2的意思是10的二進制位往左移動2位,右邊補0,10的二進制0000 1010,往左移動兩位0010 1000=40
>>(右移運算符)
右移運算是將一個二進制位的操作數按指定移動的位數向右移動,移出位被丟棄,左邊移出的空位或者一律補0,或者補符號位,這由不同的機器而定
// 右移
i = 10 >> 2;
System.out.println(i); // 2
10>>2的意思是10的二進制位往右移動2位,左邊補0,10的二進制0000 1010,往右移動兩位0000 0010=2
~(取反運算符)
二進制每一位取反,0變1,1變0
// 取反
i = ~5;
System.out.println(i); // -6
5的補碼0000 0101,補碼取反1111 1010,符號位為1,屬于負數,在計算其反碼減1=1111 1001,在換算成原碼1111 0110= -6
>>>(無符號右移運算符)
無符號右移運算符和右移運算符的主要區別在于負數的計算,因為無符號右移是高位補0,移多少位補多少個0,無符號右移運算只針對負數計算和只是對32位和64位的值有意義
// 無符號右移
i = -1 >>> 16;
System.out.println(i); // 65535
-1的二進制0000 0000 0000 0000 0000 0000 0001,取反后加1為1111 1111 1111 1111 1111 1111 1111,右移兩位0000 0000 0000 0000 1111 1111 1111 1111