1. 程式人生 > >Java8 運算子(進位制與轉換、原碼,反碼和補碼、位運算詳解、運算子的優先順序)

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));  //把整型轉成二進位制	
	}

}
  •  運算子的優先順序

推薦使用小括號限定執行的優先順序