1、 左移運算符<<
左移運算符<<使指定值的所有位都左移指定的次數。
1)通用格式
value << numnum 指定要移位值value 移動的位數。
左移的規則只記住一點:丟棄最高位,0補最低位
如果移動的位數超過了該類型的最大位數,那麼編譯器會對移動的位數取模。如對int型移動33位,實際上只移動了33%32=1位。
2)運算規則
按二進制形式把所有的數字向左移動對應的位數,高位移出(捨棄),低位的空位補零。當左移的運算數是int 類型時,每移動1位它的第31位就要被移出並且丟棄;
當左移的運算數是long 類型時,每移動1位它的第63位就要被移出並且丟棄。
當左移的運算數是byte 和short類型時,將自動把這些類型擴大爲 int 型。
3)數學意義
左移運算符<<使指定值的所有位都左移規定的次數。2、 右移運算符>>
右移運算符<<使指定值的所有位都右移指定的次數。1)通用格式
value >> numnum 指定要移位值value 移動的位數。
右移的規則只記住一點:符號位不變,左邊補上符號位
2)運算規則
按二進制形式把所有的數字向右移動對應的位數,低位移出(捨棄),高位的空位補符號位,即正數補零,負數補1當右移的運算數是byte 和short類型時,將自動把這些類型擴大爲 int 型。
例如,如果要移走的值爲負數,每一次右移都在左邊補1,如果要移走的值爲正數,每一次右移都在左邊補0,這叫做符號位擴展(保留符號位)(sign extension ),在進行右移
操作時用來保持負數的符號。
3)數學意義
右移一位相當於除2,右移n位相當於除以2的n次方。3、無符號右移>>>
1) 通用格式
value >>> numnum 指定要移位值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>