Java二進制位運算符


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();
    }
}
View Code

運行結果

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();
    }
}
View Code

運行結果

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();
    }
}
View Code

運行結果

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();
    }
}
View Code

運行結果

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();
    }
}
View Code

運行結果

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();
    }
}
View Code

運行結果

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();
    }
}
View Code

運行結果

1111 1111 1111 1111 1111 1111 0000 0000

0000 1111 1111 1111 1111 1111 1111 0000

  根據示例的輸出結果我們可以看到,二進制數向右邊移動了4位,因為是無符號右移所以空位直接補充0。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM