1. 程式人生 > >java 學習筆記之位移運算子

java 學習筆記之位移運算子

位移運算子以前一直沒怎麼注意,今天因為某些原因使用了一下,結果跟預期不一樣,所以回頭看了一下,最終發現在使用的時候還是有一些注意事項的。

java中提供了3個位移運算子:
1.帶符號的右移運算子(>>):將運算子左邊的運算物件向右移動運算子右側指定的位數。“有符號”右移位運算子使用了“符號擴充套件”:若值為正,則在高位插入 0;若值為負,則在高位插入 1 。
2.帶符號的左移運算子(<<):將運算子左邊的運算物件向左移動運算子右側指定的位數(在低位補 0) 。
3.不帶符號的右移運算子(>>>):將運算子左邊的運算物件向右移動運算子右側指定的位數。它使用了“零擴充套件”:無論正負,都在高位插入0

 。
我個人是有點兒奇怪為什麼沒有不帶符號的左移運算子呢0-0

首先要明確一點的是,位移運算子進行運算的時候,針對的是數字的補碼,這點首先要搞清楚,剛開始我一直在用原始碼進行推算,所以結果一直出錯,表示非常尷尬。如果你不知道原碼,補碼,反碼的概念,可能你需要查詢一下相關的資料瞭解一下(原碼,補碼,反碼)。

package test;

public class Test {
	public static void main(String[] args) {
		
		//11111111 11111111 11111111 11111111
		int i = -1;   
		//00000000 00111111 11111111 11111111
		i >>>= 10;     
		//4194303
		System.out.println("-1(int) >>> 10 : "+i);  
		
		//11111111 11111111 11111111 11111111 111111111 11111111 11111111 11111111
		long l = -1;
		//00000000 00111111 11111111 11111111 111111111 11111111 11111111 11111111
		l >>>= 10;
		//18014398509481983
		System.out.println("-1(long) >>> 10 : "+l);
		
		//short,char,byte進行位運算時都會先轉換成int型,剛開始不知道這點,糾結了好久。
		//11111111 11111111 11111111 11111111 
		short s = -1;
		//00000000 00000000 01111111 11111111 
		s >>>= 17;
		System.out.println("-1(short) >>> 17 : "+s);
		
		//11111111 11111111 11111111 11111111
		byte b = -1;
		//11111111 11111111 11111111 11111111
		b >>= 26;
		//-1
		System.out.println("-1(byte) >> 26 : "+b);
	}
}
綜上,有幾點需要注意:

1。位運算是針對數值的補碼來進行的。

2。short,char,byte進行位運算時,需要先將其轉換成對應的int型再進行運算。

3.若對 byte 或 short 值進行右移位運算,得到的可能不是正確的結果。它們會自動轉換成 int 型別,並進行右移位。但“零擴充套件”不會發生,所以在那些情況下會得到-1 的結果 。

下面有個通過位移符來實現的輸出一個int數值的二進位制的方法,可以加深一下學習:

public void printBinInt(String s, int i) {
    System.out.println(s + ", int: " + i + ", binary: ");
    System.out.print(" ");
    //通過迴圈,用1與數字的每一位相與,從而得出當前位的值是0還是1
    for(int j = 31; j >=0; j--){
        if(((1 << j) & i) != 0)
            System.out.print("1");
        else
            System.out.print("0");
   }
   System.out.println();
}


以上為本篇內容