1.簡述
看這篇文章之前首先了解一下原碼,反碼,補碼的概念。https://www.cnblogs.com/bl123/p/13730998.html
需要注意的是,二進制都是從高位到低位。
2.位運算符分類
符號 | 描述 | 運算規則 |
& | 與 | 按位與,如果對應的二進制位同時為 1,那么計算結果才為 1;否則為 0。因此,任何數與 0 進行按位與運算,其結果都為 0。 |
| | 或 | 按位或,如果對應的二進制位只要有一個為 1,那么結果就為 1;如果對應的二進制位都為 0,結果才為 0。 |
^ | 異或 | 按位異或,如果對應的二進制位相同(同時為 0 或同時為 1)時,結果為 0;如果對應的二進制位不相同,結果則為 1。 |
~ | 取反 | 按位取反,只對一個操作數進行運算,將操作數二進制中的 1 改為 0,0 改為 1。 |
>> | 右移 | 有符號按位右移,只對一個操作數進行運算,將操作數二進制形式向右移動對應的位數,低位移出(舍棄),高位的空位補零。 |
<< | 左移 | 按位左移,只對一個操作數進行運算,將操作數二進制形式向左移動對應的位數,高位移出(舍棄),低位的空位補零。 |
>>> | 無符號右移 | 無符號按位右移,只對一個操作數進行運算,將操作數按二進制形式忽略符號位的右移,空位都以0補齊。 |
3.分類中各種位運算符簡述
(1)&(與運算)
參加運算的兩個數據,按二進制位進行“與”運算。
運算規則:0 & 0 = 0、0 & 1 = 0、1 & 0 = 0、1 & 1 = 1。即:兩位同時為1,結果才為1,否則為0。
示例如下:

public class Test{ public static void main(String[] args) { System.out.println(binaryToDecimal(3)); System.out.println(binaryToDecimal(5)); System.out.println(binaryToDecimal(3 & 5)); System.out.println(3 & 5); } /**將10進制轉為2進制字符串 */ private static String binaryToDecimal(int num) { StringBuilder sb = new StringBuilder(); sb.append(Integer.toBinaryString(num));//是有jdk自帶方法轉為二進制 int length = sb.length(); for (int i = 0; i < 16 - length; i++) {//補齊16位 sb.insert(0, 0); } length = sb.length(); for (int i = 0; i < length; i++) { if((i + 1) % 5 == 0) sb.insert(i, " "); } return sb.toString(); } }
運行結果
0000 0000 0000 0011
0000 0000 0000 0101
0000 0000 0000 0001
1
根據示例的輸出結果我們可以得出,3 & 5即0000 0000 0000 0011 & 0000 0000 0000 0101 = 0000 0000 0000 0001因此,3 & 5的值等於1。
(2)|(或運算)
參與運算的兩個數據,按照二進制位進行“或”運算。
運算規則:0 & 0 = 0、0 & 1 = 1、1 & 0 = 1、1 & 1 = 1。即:參與運算的兩個數據只要有一個值為1 那么值為1。
示例如下:

public class Test{ public static void main(String[] args) { System.out.println(binaryToDecimal(3)); System.out.println(binaryToDecimal(5)); System.out.println(binaryToDecimal(3 | 5)); System.out.println(3 | 5); } /**將10進制轉為2進制字符串 */ private static String binaryToDecimal(int num) { StringBuilder sb = new StringBuilder(); sb.append(Integer.toBinaryString(num));//是有jdk自帶方法轉為二進制 int length = sb.length(); for (int i = 0; i < 16 - length; i++) {//補齊16位 sb.insert(0, 0); } length = sb.length(); for (int i = 0; i < length; i++) { if((i + 1) % 5 == 0) sb.insert(i, " "); } return sb.toString(); } }
運行結果
0000 0000 0000 0011
0000 0000 0000 0101
0000 0000 0000 0111
7
根據示例的輸出結果我們可以得出,3 | 5即0000 0000 0000 0011 | 0000 0000 0000 0101 = 0000 0000 0000 0111因此,3 | 5的值等於7。
(3)^(異或運算)
參與運算的兩個數據,按照二進制位進行“異或”運算。
運算規則:0 & 0 = 0、0 & 1 = 1、1 & 0 = 1、1 & 1 = 0。即:參加運算的兩個對象,如果兩個相應位值不同,則該位結果為1,否則為0。
示例如下:

public class Test{ public static void main(String[] args) { System.out.println(binaryToDecimal(3)); System.out.println(binaryToDecimal(5)); System.out.println(binaryToDecimal(3 ^ 5)); System.out.println(3 ^ 5); } /**將10進制轉為2進制字符串 */ private static String binaryToDecimal(int num) { StringBuilder sb = new StringBuilder(); sb.append(Integer.toBinaryString(num));//是有jdk自帶方法轉為二進制 int length = sb.length(); for (int i = 0; i < 16 - length; i++) {//補齊16位 sb.insert(0, 0); } length = sb.length(); for (int i = 0; i < length; i++) { if((i + 1) % 5 == 0) sb.insert(i, " "); } return sb.toString(); } }
運行結果
0000 0000 0000 0011
0000 0000 0000 0101
0000 0000 0000 0110
6
根據示例的輸出結果我們可以得出,3 ^ 5即0000 0000 0000 0011 ^ 0000 0000 0000 0101 = 0000 0000 0000 0110因此,3 ^ 5的值等於6。
(4)~(取反運算)
參與取反的一個數據,按照二進制位進行“取反”運算。
取反規則:1 = 0、0 = 1。即:參加取反的一個對象,如果相應位值為0,則該位結果為1,否則為0。
示例如下:

public class Test{ public static void main(String[] args) { System.out.println(binaryToDecimal(3)); System.out.println(binaryToDecimal(~3)); } /**將10進制轉為2進制字符串 */ private static String binaryToDecimal(int num) { StringBuilder sb = new StringBuilder(); sb.append(Integer.toBinaryString(num));//是有jdk自帶方法轉為二進制 int length = sb.length(); for (int i = 0; i < 32 - length; i++) {//補齊16位 sb.insert(0, 0); } length = sb.length(); for (int i = 0; i < length + 3; i++) { if((i + 1) % 5 == 0) sb.insert(i, " "); } return sb.toString(); } }
運行結果
0000 0000 0000 0000 0000 0000 0000 0011
1111 1111 1111 1111 1111 1111 1111 1100
根據示例的輸出結果我們可以得出,~3即0000 0000 0000 0000 0000 0000 0000 0011 = 1111 1111 1111 1111 1111 1111 1111 1100。
(5)>>(右移運算)
參與右移的一個數據,按照二進制位進行“右移”運算。
示例如下:

public class Test{ public static void main(String[] args) { System.out.println(binaryToDecimal(-256)); System.out.println(binaryToDecimal(-256 >> 4)); } /**將10進制轉為2進制字符串 */ private static String binaryToDecimal(int num) { StringBuilder sb = new StringBuilder(); sb.append(Integer.toBinaryString(num));//是有jdk自帶方法轉為二進制 int length = sb.length(); for (int i = 0; i < 16 - length; i++) {//補齊16位 sb.insert(0, 0); } length = sb.length(); for (int i = 0; i < length + 3; i++) { if((i + 1) % 5 == 0) sb.insert(i, " "); } return sb.toString(); } }
運行結果
1111 1111 1111 1111 1111 1111 0000 0000
1111 1111 1111 1111 1111 1111 1111 0000
根據示例的輸出結果我們可以看到,二進制數向右邊移動了4位,因為是有符號的右移,所以如果是負數的話,那就會補充1,正數則補充0。
(6)<<(左移運算)
參與左移的一個數據,按照二進制位進行“左移”運算。
示例如下:

public class Test{ public static void main(String[] args) { System.out.println(binaryToDecimal(-256)); System.out.println(binaryToDecimal(-256 << 4)); } /**將10進制轉為2進制字符串 */ private static String binaryToDecimal(int num) { StringBuilder sb = new StringBuilder(); sb.append(Integer.toBinaryString(num));//是有jdk自帶方法轉為二進制 int length = sb.length(); for (int i = 0; i < 32 - length; i++) {//補齊16位 sb.insert(0, 0); } length = sb.length(); for (int i = 0; i < length + 3; i++) { if((i + 1) % 5 == 0) sb.insert(i, " "); } return sb.toString(); } }
運行結果
1111 1111 1111 1111 1111 1111 0000 0000
1111 1111 1111 1111 1111 0000 0000 0000
根據示例的輸出結果我們可以看到,二進制數向左邊移動了4位,空位補充0。
(7)>>>(無符號右移運算)
參與無符號右移的一個數據,按照二進制位進行“無符號右移”運算。
示例如下:

public class Test{ public static void main(String[] args) { System.out.println(binaryToDecimal(-256)); System.out.println(binaryToDecimal(-256 >>> 4)); } /**將10進制轉為2進制字符串 */ private static String binaryToDecimal(int num) { StringBuilder sb = new StringBuilder(); sb.append(Integer.toBinaryString(num));//是有jdk自帶方法轉為二進制 int length = sb.length(); for (int i = 0; i < 32 - length; i++) {//補齊16位 sb.insert(0, 0); } length = sb.length(); for (int i = 0; i < length + 3; i++) { if((i + 1) % 5 == 0) sb.insert(i, " "); } return sb.toString(); } }
運行結果
1111 1111 1111 1111 1111 1111 0000 0000
0000 1111 1111 1111 1111 1111 1111 0000
根據示例的輸出結果我們可以看到,二進制數向右邊移動了4位,因為是無符號右移所以空位直接補充0。