java中的移位操作詳解
java中的移位操作只對int和long有效,byte、short、char升級為int後再進行移位
移位操作符有>>(右移)、<<(左移)、>>>(右移)三種,注意兩點:1.沒有<<<符號 2.移位是不循環的
三種的區別是
>>是帶符號右移,負數高位補1,正數補0 ----->>>也就是在高位用符號位進行填充。
<<左移不管負數還是正數,在低位永遠補0
>>>是不帶符號右移,不論負數還是正數,高位補0(無符號右移,忽略符號位,空位都以0補齊)
在具體的運算中全部轉化為補碼邏輯進行移位或者按位運算。
測試程序:
[java]
- publicclassShift{
- publicstaticvoidmain(String[]args){
- System.out.println("******************正數左移在低位補0*******************");
- inta=1;
- a=a<<2;
- System.out.println(a);
- System.out.println(Integer.toBinaryString(a));
- System.out.println("******************正數右移在高位補0********************");
- a=1;
- a=a>>2;
- System.out.println(a);
- System.out.println(Integer.toBinaryString(a));
- System.out.println("******從上面結果可以看出:移位是不循環的*****");
- System.out.println("看看負數的移位:");
-
- System.out.println("***********負數的右移操作高位補1**************");
- inti=-1;
- System.out.println(i+":");
- System.out.println(Integer.toBinaryString(i));
- i=i>>2;
- System.out.println(i);
- System.out.println(Integer.toBinaryString(i));
- System.out.println("**********負數的左移操作低位補0*****************");
- i=i<<2;
- System.out.println(i);
- System.out.println(Integer.toBinaryString(i));
- System.out.println("*************再看看>>>操作符*************");
- System.out.println("*************負數的>>>操作高位補0***************");
- i=-1;
- System.out.println(Integer.toBinaryString(i));
- i=i>>>10;
- System.out.println(i+":");
- System.out.println(Integer.toBinaryString(i));
- System.out.println("*************注意:沒有<<<符號**************");
-
- System.out.println("**********byte類型移位時要強轉換*************");
- bytek=10;
- System.out.println(Integer.toBinaryString(k));
- k=(byte)((byte)k>>>2);
- System.out.println(Integer.toBinaryString(k));
- }
- }
運行結果:
******************正數左移在低位補0*******************
4
100
******************正數右移在高位補0********************
0
0
******從上面結果可以看出:移位是不循環的*****
看看負數的移位:
***********負數的右移操作高位補1**************
-1:
11111111111111111111111111111111
-1
11111111111111111111111111111111
**********負數的左移操作低位補0*****************
-4
11111111111111111111111111111100
*************再看看>>>操作符*************
*************負數的>>>操作高位補0***************
11111111111111111111111111111111
4194303:
1111111111111111111111
*************注意:沒有<<<符號**************
**********byte類型移位時要強轉換*************
1010
10