天天看點

位運算符詳細解析

位運算符計算,先把十進制轉為二進制,計算完在轉回十進制,以下位轉換和計算規則

⼗進制和⼆進制的轉換:

⼗進制轉⼆進制:⽬标數除以2,若能除盡,該位記做0,若除不盡,該位記做1,再對商繼續除以2,以

此類推,直到商為0,然後把每⼀位的結果反序組合就是對應的⼆進制。

比如對十進制目标數10轉二進制:

10/2=5–>0

5/2=2.5–>1

2/2=1–>0

1/2=0.5–>1

從下往上對應從左往右排列 是以轉為的二進制是:1010

比如對十進制目标數17轉二進制:

17/2=8.5–>1

8/2=4–>0

4/2=2–>0

2/2=1–>0

1/2=0.5–>1

從下往上對應從左往右排列 是以轉為的二進制是:10001

⼆進制轉⼗進制:從⽬标數的最後側起,本位的數值乘以本位的權重,權重就是2的第⼏位的位數減⼀

次⽅,将每⼀位的值進⾏相加,得到的結果就是對應的⼗進制。

例如将二進制1010轉為十進制

1                0               1                0
1*2^3    +     0* 2^2     +     1*2^1    +      0*2^0 = 8+0+2+0=10
           

例如将二進制10001轉為十進制

1            0               0                0               1
1*2^4    +   0*2^3      +     0*2^2      +     0*2^1     +      1*2^0 = 16+0+0+0+1 = 17  

           

位運算符:&(按位與)、|(按位或)、^(按位異或)、<<(左移)、>>(右移)

1、&(按位與)

計算規則:變量1 & 變量2:先把變量 1 和變量 2 轉為⼆進制,每⼀位的數字⼀⼀對應,進⾏⽐較判斷,若都為

1,則該位記做 1,否則記做 0

例如:計算10 & 17

位數不夠左邊補0,例如17的二進制是10001,10的二進制是1010比17的二進制少一位是以在前邊補0變為01010

0  1  0  1  0
 1  0  0  0  1
 -------------
 0  0  0  0  0 = 0(參考二進制轉十進制的算法,是以結果是0)
           

2、|(按位或)

計算規則:變量1 | 變量2:先把變量 1 和變量 2 轉為⼆進制,每⼀位的數字⼀⼀對應,進⾏⽐較判斷,隻要有1個為 1,則該位記做 1,否則記做 0

例如:計算10 | 17

0  1  0  1  0
 1  0  0  0  1
 -------------
 1  1  0  1  1 = 1*2^4+1*2^3+0+1*2^1+1*2^0 = 16+8+0+2+1=27
           

3、^(按位異或)

計算規則:變量1 ^ 變量2:先把變量 1 和變量 2 轉為⼆進制,每⼀位的數字⼀⼀對應,進⾏⽐較判斷,相同記做0,不同記做 1。

例如:計算10 ^17

0  1  0  1  0
 1  0  0  0  1
 -------------
 1  1  0  1  1 = 27  
           

看到這裡,可能就有人發現,咦,這個10 | 17 和這個10 ^17怎麼結果一樣,是不是有問題,下邊代碼校驗

public class Demo2 {
    public static void main(String[] args) {
        //假設目标是是10
        int a = 10 | 17;
        int b = 10^17;
        System.out.println(a);
        System.out.println(b);
        System.out.println(a == b);
    }
}
           
27
27
true
           

兩個結果都是27,結果位true

4、<<(左移)

計算規則:變量1 << 變量2:變量1乘以2的變量2次⽅ a<<b = a*2^b (a , b必須是整數)

舉例子:2<<3

5、>>(右移)

計算規則:變量1 >> 變量2:變量1除以2的變量2次⽅ a>>b = a/2^b,若結果為整數帶小數則取整數,如果結果為複數帶小數,結果取整然後減1

舉例子:1>>2

使用代碼校驗

public class Demo2 {
    public static void main(String[] args) {
        //假設目标是是10
        System.out.println(2<<3);
        System.out.println(1>>4);
        System.out.println(-1>>4);
    }
}
           
16
0
-1
           

繼續閱讀