Java8 運算子(進位制與轉換、原碼,反碼和補碼、位運算詳解、運算子的優先順序)
- 進位制
binary: 1 -> 10 -> 11 -> 100 每次從後面進一位
octal: 7-> 10 八進位制是0-7之間,底數為8的計算
hexadecimal:A....F
- 轉換
十進位制轉換成其他進位制:轉化成幾進位制就除以幾
比如, 十進位制的12,轉化成二進位制就除以2,然後將餘數反著寫即可
12
6-----------0
3-----------0
1-----------1
0-----------1 //1除以2得0餘1
二進位制轉化成其他進位制用乘法
- 原碼、反碼、補碼
原碼:數的二進位制表示,正數以0開頭,負數以1開頭
反碼:原碼的符號位不變,其他位取反
補碼:在反碼的基礎上加1
正數的原碼、反碼和補碼相同
比如:
12
0000 0000 0000 0000 0000 0000 0000 1100
第一位是0, 所有表示一個正數
-12
0000 0000 0000 0000 0000 0000 0000 1100 取反如下,
1111 1111 1111 1111 1111 1111 1111 0011 反碼, 開頭1表示負數
1111 1111 1111 1111 1111 1111 1111 0100 在反碼的基礎上+1就是補碼了
- 位運算(&, | , ^ , ~)
參與運算的都是整形資料,將資料轉成二進位制再按位運算
&: 只有兩個位上都是1結果才是1
| : 只要兩個位上有一個是1 ,結果就是1
^: 異或運算,相同為0,不同為1
~: 位非,按位取反,每一位取反
如:
0000 0000 0000 0000 0000 0000 0000 1100 的~運算後
1111 1111 1111 1111 1111 1111 1111 0011
package project4;
public class test6 {
public static void main(String[] args) {
System.out.println(12&13);
System.out.println(12|13);
System.out.println(12^13);
System.out.println(~12); //取反
}
}
輸出結果:
12
13
1
-13
靈活掌握 原碼,反碼,補碼之間的關係和運算,比如,知道補碼怎麼求原碼?補碼減去1再取反就是原碼了
- 位運算(<<,>>,>>>)
參與運算的數都是整數資料,將資料轉成二進位制再移位運算
<< :向左運算,在低位補0
>> : 有符號右移,若值為正,則在高位插入0, 若值為負,則在高位插入1
>>> : 無符號右移,無論正負,都在高位插入0
若對char、byte、short進行移位處理,在移位之前,他們會自動轉換成一個int
package project4;
public class test6 {
public static void main(String[] args) {
System.out.println(12<<2);
/* 0000 0000 0000 0000 0000 0000 0000 1100 :12
00 0000 0000 0000 0000 0000 0000 110000 <<
12左移兩位就是去掉12最左邊的兩位,然後在最後面補0*/
System.out.println(12>>2);
/* 0000 0000 0000 0000 0000 0000 0000 1100 :12
00 0000 0000 0000 0000 0000 0000 0000 11 >>
12右移就是去掉最右邊兩位,然後在最左邊補兩個0*/
System.out.println(-12>>>2);
/*00 1111 1111 1111 1111 1111 1111 1111 01 -12>>>2*/
System.out.println(Integer.toBinaryString(1073741821)); //把整型轉成二進位制
}
}
- 運算子的優先順序
推薦使用小括號限定執行的優先順序