位運算符計算,先把十進制轉為二進制,計算完在轉回十進制,以下位轉換和計算規則
⼗進制和⼆進制的轉換:
⼗進制轉⼆進制:⽬标數除以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