移位運算符就是在二進制的基礎上對數字進行平移。按照平移的方向和填充數字的規則分爲三種:<<(左移)、>>(帶符號右移)和>>>(無符號右移)。 在移位運算時,byte、short和char類型移位後的結果會變成int類型,對於byte、short、char和int進行移位時,規定實際移動的次數是移動次數和32的餘數,也就是移位33次和移位1次獲得的結果相同。移動long型的數值時,規定實際移動的次數是移動次數和64的餘數,也就是移動66次和移動2次獲得的結果相同。 三種移位運算符的移動規則和使用以下所示: <<運算規則:按二進制形式把全部的數字向左移動對應的位數,高位移出(捨棄),低位的空位補零。 語法格式: 須要移位的數字 << 移位的次數 例如: 3 << 2,則是將數字3左移2位 計算過程: 3 << 2 首先把3轉換爲二進制數字0000 0000 0000 0000 0000 0000 0000 0011,而後把該數字高位(左側)的兩個零移出,其餘的數字都朝左平移2位,最後在低位(右側)的兩個空位補零。則獲得的最終結果是0000 0000 0000 0000 0000 0000 0000 1100,則轉換爲十進制是12.數學意義: 在數字沒有溢出的前提下,對於正數和負數,左移一位都至關於乘以2的1次方,左移n位就至關於乘以2的n次方。 >>運算規則:按二進制形式把全部的數字向右移動對應巍峨位數,低位移出(捨棄),高位的空位補符號位,即正數補零,負數補1. 語法格式: 須要移位的數字 >> 移位的次數 例如11 >> 2,則是將數字11右移2位 計算過程:11的二進制形式爲:0000 0000 0000 0000 0000 0000 0000 1011,而後把低位的最後兩個數字移出,由於該數字是正數,因此在高位補零。則獲得的最終結果是0000 0000 0000 0000 0000 0000 0000 0010.轉換爲十進制是3.數學意義:右移一位至關於除2,右移n位至關於除以2的n次方。 >>>運算規則:按二進制形式把全部的數字向右移動對應巍峨位數,低位移出(捨棄),高位的空位補零。對於正數來講和帶符號右移相同,對於負數來講不一樣。 其餘結構和>>類似。 小結 二進制運算符,包括位運算符和移位運算符,使程序員能夠在二進制基礎上操做數字,能夠更有效的進行運算,而且能夠以二進制的形式存儲和轉換數據,是實現網絡協議解析以及加密等算法的基礎。 實例操做: public class URShift { public static void main(String[] args) { int i = -1; i >>>= 10; //System.out.println(i); mTest(); } public static void mTest(){ //左移 int i = 12; //二進制爲:0000000000000000000000000001100 i <<= 2; //i左移2位,把高位的兩位數字(左側開始)拋棄,低位的空位補0,二進制碼就爲0000000000000000000000000110000 System.out.println(i); //二進制110000值爲48; System.out.println("<br>"); //右移 i >>=2; //i右移2爲,把低位的兩個數字(右側開始)拋棄,高位整數補0,負數補1,二進制碼就爲0000000000000000000000000001100 System.out.println(i); //二進制碼爲1100值爲12 System.out.println("<br>"); //右移example int j = 11;//二進制碼爲00000000000000000000000000001011 j >>= 2; //右移兩位,拋棄最後兩位,整數補0,二進制碼爲:00000000000000000000000000000010 System.out.println(j); //二進制碼爲10值爲2 System.out.println("<br>"); byte k = -2; //轉爲int,二進制碼爲:0000000000000000000000000000010 k >>= 2; //右移2位,拋棄最後2位,負數補1,二進制嗎爲:11000000000000000000000000000 System.out.println(j); //二進制嗎爲11值爲2 } } 在Thinking in Java第三章中的一段話: 移位運算符面向的運算對象也是 二進制的「位」。 可單獨用它們處理整數類型(主類型的一種)。左移位運算符(<<)能將運算符左邊的運算對象向左移動運算符右側指定的位數(在低位補0)。 「有符號」右移位運算符(>>)則將運算符左邊的運算對象向右移動運算符右側指定的位數。「有符號」右移位運算符使用了「符號擴展」:若值爲正,則在高位插入0;若值爲負,則在高位插入1。Java也添加了一種「無符號」右移位運算符(>>>),它使用了「零擴展」:不管正負,都在高位插入0。這一運算符是C或C++沒有的。 若對char,byte或者short進行移位處理,那麼在移位進行以前,它們會自動轉換成一個int。只有右側的5個低位纔會用到。這樣可防止咱們在一個int數裏移動不切實際的位數。若對一個long值進行處理,最後獲得的結果也 是long。此時只會用到右側的6個低位,防止移動超過long值裏現成的位數。但在進行「無符號」右移位時,也可能遇到一個問題。若對byte或 short值進行右移位運算,獲得的可能不是正確的結果(Java 1.0和Java 1.1特別突出)。它們會自動轉換成int類型,並進行右移位。但「零擴展」不會發生,因此在那些狀況下會獲得-1的結果。