java 學習筆記之位移運算子
阿新 • • 發佈:2019-01-30
位移運算子以前一直沒怎麼注意,今天因為某些原因使用了一下,結果跟預期不一樣,所以回頭看了一下,最終發現在使用的時候還是有一些注意事項的。
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(); }
以上為本篇內容