java中的移位操作

來源:互聯網
上載者:User

        其實電腦中的數值用補碼來表示,主要目的一是防止0有兩種編碼,二是將減法用加法表示方面電路設計,或者說電路只能進行加法運算,所以把負數變成補碼後就相當於加法運算。正數的補碼和它的源碼相同,負數的補碼則不同。所以對於移位而言,如果是負數,從我們的角度來看,應該是先寫出這個負數的正數對應的補碼,即為該負數的值,然後進行移位;移位的結果中,如果高位為0表示這個移位後的結果為正數;反之為負數,這時可以求它的補碼來求得該負數的值,具體可以見下面的例子。

         這裡介紹下移位的原理,<<表示左移,和符號沒有關係,>>和>>>表示有符號右移和無符號右移,具體操作如下。

>>:int a = -2; int b = (a>>2);結果b為-1,過程為:

2對應的二進位位(由於int為4位元組)0000 0000 ......00000010

所以-2對應的二進位為:對2的二進位先求補碼1111 1111 ......11111110

右移兩位,高位補1,得到1111 1111 ......1111 1111由於高位為1,所以這是個負數,負數的值可以通過對此求補碼來看到,補碼為0000 0000 ...... 0000 0001,所以移位後的結果為-1。

>>>:int a = -2;
int
b = (a>>2);結果b為1073741823,過程為:

2對應的二進位位(由於int為4位元組)0000 0000 ......00000010

所以-2對應的二進位為:對2的二進位先求補碼1111 1111 ......11111110

右移兩位,高位補0,得到0011 1111 ......1111 1111由於高位為0,所以移位的結果為正數,即這就是結果,這個結果0011 1111 ...... 1111 1111對應的十進位就是1073741823。

<<:int a = -2;
int
b = (a>>2);結果b為,過程為:

2對應的二進位位(由於int為4位元組)0000 0000 ......00000010

所以-2對應的二進位為:對2的二進位先求補碼1111 1111 ......11111110

左移兩位,低位補0,得到1111 1111 ...... 1111 1000,由於高位為1,所以這個移位的結果為負數,對此求補碼,就可以知道這個負數的值,補碼為0000 0000 ...... 0000 1000,補碼的結果為8,所以對應的負數為-8。

         另外,需要注意的是,對於如下代碼

int i=-1; 

int j=i>>>35;

java在啟動並執行時候是這樣的:由於int是4位元組32位的,所以在進行移位時實際是取的移位元35的模,即35mod32為3,相當於移位了3位,而不是移動了35位,這一點要格外注意。

         還有就是java在對char byte short進行移位的時候,在移位前,會將他們自動轉成int型,然後在進行移位。注意,轉成了int和不轉成int的移位效果有時候區別是很大。而且在java中會提示我們有錯誤,如所示


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.