java中的移位運算符有三種:
1、 <<: 左移
2、 >>: 右移
3、 >>>: 無符號右移
使用方法:左移就是將左邊的操作數在內存中的二進制數據左移指定的位數,左邊移空的部分補零,右移:如果最高位是0,空位就填0,如果最高位是1,空位就填1。無符號右移無論最高位是什么,空位都補零。
數據在內存中以補碼的形式存儲
左移和右移的數學意義:
對於左移,對於整型a, a<<n=a*2^n(前提是結果在整型的范圍之內),對於右移 正的整型a, a>>n=a/2^n,對於負的整型a,a>>n=-(|a|/2^n+1);
為什么對於右移,正數和負數的結果不一樣呢?
我們可以看一個例子:
package sort; public class sort1 { public static void main(String[] args) { // TODO Auto-generated method stub int a=-123; System.out.println("原二進制位:"+Integer.toBinaryString(a)); int b=a>>2; System.out.println("右移兩位結果為:"+b); System.out.println("右移后二進制位:"+Integer.toBinaryString(b)); int c=123; System.out.println("原二進制位:"+Integer.toBinaryString(c)); int d=c>>2; System.out.println("右移后的結果為:"+d); System.out.println("右移后二進制位:"+Integer.toBinaryString(d)); } }
運行結果為:
對於123,其二進制數為0 1111011,右移兩位相當於把0 111000右移兩位,而0 111000的十進制為120,所以結果為120/4=30;
對於-123,其二進制數為1 0000101,右移兩位相當於把1 0000100右移兩位,而1 0000100的十進制為-124,所以結果為-124/4=-31。