運算符 左移, 無符號右移>>>

 1、 左移運算符<<

  左移運算符<<使指定值的所有位都左移指定的次數。

  1)通用格式

  value << num
  num 指定要移位值value 移動的位數。
  左移的規則只記住一點:丟棄最高位,0補最低位
  如果移動的位數超過了該類型的最大位數,那麼編譯器會對移動的位數取模。如對int型移動33位,實際上只移動了33%32=1位。

  2)運算規則

  按二進制形式把所有的數字向左移動對應的位數,高位移出(捨棄),低位的空位補零。
  當左移的運算數是int 類型時,每移動1位它的第31位就要被移出並且丟棄;
  當左移的運算數是long 類型時,每移動1位它的第63位就要被移出並且丟棄。
  當左移的運算數是byte 和short類型時,將自動把這些類型擴大爲 int 型。

  3)數學意義

  左移運算符<<使指定值的所有位都左移規定的次數。

 2、 右移運算符>>

  右移運算符<<使指定值的所有位都右移指定的次數。

  1)通用格式

  value >> num
  num 指定要移位值value 移動的位數。
  右移的規則只記住一點:符號位不變,左邊補上符號位

  2)運算規則

  按二進制形式把所有的數字向右移動對應的位數,低位移出(捨棄),高位的空位補符號位,即正數補零,負數補1
  當右移的運算數是byte 和short類型時,將自動把這些類型擴大爲 int 型。
  例如,如果要移走的值爲負數,每一次右移都在左邊補1,如果要移走的值爲正數,每一次右移都在左邊補0,這叫做符號位擴展(保留符號位)(sign extension ),在進行右移
  操作時用來保持負數的符號。

  3)數學意義

  右移一位相當於除2,右移n位相當於除以2的n次方。

  3、無符號右移>>>

  1) 通用格式

  value >>> num
  num 指定要移位值value 移動的位數。

     2) 運算規則

  無符號右移的規則只記住一點:忽略了符號位擴展,0補最高位
  無符號右移運算符>>> 只是對32位和64位的值有意義

==================================我是分割線===============================================================

下面是寫的一組測試:


<span style="font-size:14px;">	@Test
	public void test(){
		//左移<<規則:移除的高位丟棄,低位補0 , 左移n位就相當於在原來值的基礎上乘以2的n次方
		short v1 = -3;
		//原碼:1000 0000 0000 0000 0000 0000 0000 0011
		//取反~
		//反碼:1111 1111 1111 1111 1111 1111 1111 1100   
		//加1
		//補碼:1111 1111 1111 1111 1111 1111 1111 1101
		//左移3位後
		//補碼:1111 1111 1111 1111 1111 1111 1110 1000
		//減1
		//反碼:1111 1111 1111 1111 1111 1111 1110 0111
		//取反
		//原碼:1000 0000 0000 0000 0000 0000 0001 1000 ->值:-24
		Assert.assertTrue(v1<<3 == -24);
		
		short v2 = 3;
		//正數原碼,反碼,補碼相同
		//原碼: 0000 0000 0000 0000 0000 0000 0000 0011 
		//反碼: 0000 0000 0000 0000 0000 0000 0000 0011
		//補碼: 0000 0000 0000 0000 0000 0000 0000 0011
		//補碼: 0000 0000 0000 0000 0000 0000 0001 1000 
		//反碼: 0000 0000 0000 0000 0000 0000 0001 1000
		//原碼: 0000 0000 0000 0000 0000 0000 0001 1000 ->值:24
		Assert.assertTrue(v2<<3 == 24);
		
		short v3 = -100;
		//原碼: 1000 0000 0000 0000 0000 0000 0110 0100 
		//取反~
		//反碼: 1111 1111 1111 1111 1111 1111 1001 1011
		//加1
		//補碼: 1111 1111 1111 1111 1111 1111 1001 1100
		//左移3位後
		//補碼: 1111 1111 1111 1111 1111 1100 1110 0000
		//減1:
		//反碼: 1111 1111 1111 1111 1111 1100 1101 1111
		//取反~
		//原碼: 1000 0000 0000 0000 0000 0011 0010 0000 ->值:-800
		Assert.assertTrue(v3<<3 == -800);
		
		//右移>>規則:移除的低位丟棄,高位根據原符號位補相應的值,如原爲負值,符號位爲1,則補1,否則補0 
		//-3
		//原碼:1000 0000 0000 0000 0000 0000 0000 0011
		//取反~
		//反碼:1111 1111 1111 1111 1111 1111 1111 1100   
		//加1
		//補碼:1111 1111 1111 1111 1111 1111 1111 1101
		//右移3位,高位補1
		//補碼:1111 1111 1111 1111 1111 1111 1111 1111
		//減1
		//反碼:1111 1111 1111 1111 1111 1111 1111 1110
		//取反~
		//原碼:1000 0000 0000 0000 0000 0000 0000 0001 ->值:-1
		Assert.assertTrue(v1>>3 == -1);
		
		//3
		//正數原碼,反碼,補碼相同
		//原碼: 0000 0000 0000 0000 0000 0000 0000 0011 
		//反碼: 0000 0000 0000 0000 0000 0000 0000 0011
		//補碼: 0000 0000 0000 0000 0000 0000 0000 0011
		//右移3位,高位補0
		//補碼: 0000 0000 0000 0000 0000 0000 0000 0000 
		//反碼: 0000 0000 0000 0000 0000 0000 0000 0000  
		//原碼: 0000 0000 0000 0000 0000 0000 0000 0000 ->值:0
		Assert.assertTrue(v2>>3 == 0);
		
		//-100
		//原碼: 1000 0000 0000 0000 0000 0000 0110 0100 
		//反碼: 1111 1111 1111 1111 1111 1111 1001 1011 
		//補碼: 1111 1111 1111 1111 1111 1111 1001 1100
		//左移3位,高位補1
		//補碼: 1111 1111 1111 1111 1111 1111 1111 0011  
		//反碼: 1111 1111 1111 1111 1111 1111 1111 0010
		//原碼: 1000 0000 0000 0000 0000 0000 0000 1101 ->值:-13
		Assert.assertTrue(v3>>3 == -13);
		
		//右移>>>規則:移除的低位丟棄,高位補0 
		//-3
		//原碼:1000 0000 0000 0000 0000 0000 0000 0011
		//取反~
		//反碼:1111 1111 1111 1111 1111 1111 1111 1100   
		//加1
		//補碼:1111 1111 1111 1111 1111 1111 1111 1101
		//右移3位,高位補0
		//補碼:0001 1111 1111 1111 1111 1111 1111 1111
		//符號位爲0,則表正數,補碼和反碼相同
		//反碼:0001 1111 1111 1111 1111 1111 1111 1111
		//符號位爲0,則表正數,原碼和反碼相同
		//原碼:0001 1111 1111 1111 1111 1111 1111 1111 ->值:536870911
		Assert.assertTrue(v1>>>3 == 536870911);
		
		//3
		//原碼: 0000 0000 0000 0000 0000 0000 0000 0011 
		//反碼: 0000 0000 0000 0000 0000 0000 0000 0011
		//補碼: 0000 0000 0000 0000 0000 0000 0000 0011
		//右移3位,高位補0
		//補碼: 0000 0000 0000 0000 0000 0000 0000 0000 
		//反碼: 0000 0000 0000 0000 0000 0000 0000 0000  
		//原碼: 0000 0000 0000 0000 0000 0000 0000 0000 ->值:0
		Assert.assertTrue(v2>>>3 == 0);
		
		//-100
		//原碼: 1000 0000 0000 0000 0000 0000 0110 0100 
		//反碼: 1111 1111 1111 1111 1111 1111 1001 1011 
		//補碼: 1111 1111 1111 1111 1111 1111 1001 1100
		//左移3位,高位補0
		//補碼: 0001 1111 1111 1111 1111 1111 1111 0011  
		//符號位爲0,則表正數,補碼和反碼相同
		//反碼: 0001 1111 1111 1111 1111 1111 1111 0011
		//符號位爲0,則表正數,原碼和反碼相同
		//原碼: 0001 1111 1111 1111 1111 1111 1111 0011 ->值:536870899
		Assert.assertTrue(v3>>>3 == 536870899);
	}</span>


發佈了73 篇原創文章 · 獲贊 18 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章