java位移操作

<1>.在瞭解位移之前,先了解一下正數和負數的二進制表示形式以及關係:
舉例15和-15:

15的原碼: 00000000 00000000 00000000 00001111 
    補碼: 11111111 11111111 11111111 11110000
                 +1 = 
-15的原碼:11111111 11111111 11111111 11110001

負數的原碼即爲:正數的原碼取反,再加1。

<2>位移操作:(只針對int類型的數據有效,java中,一個int的長度始終是32位,也就是4個字節,它操作的都是該整數的二進制數).也可以作用於以下類型,即byte,short,char,long(當然,它們都是整數形式)。當爲這四種類型是,JVM先把它們轉換成int型再進行操作。

<<     左移   
>>     右移
>>>    無符號右移

<<和>>爲數值位移,>>>爲邏輯位移。【注】:Java中不存在<<<。

$1>m<<n的含義:把整數m表示的二進制數左移n位,高位移出n位都捨棄,低位補0.  (此時將會出現正數變成負數的形式)
實例:
  3<<2剖析:
  3二進制形式: 00000000 00000000 00000000 00000011,按照$1的原理,得到00000000 00000000 00000000 00001100,即爲12. 
  
  左移使整數變爲負數:
  10737418<<8
  10737418二進制表示形式:00000000 10100011 11010111 00001010,按照$1的原理,得到10100011 11010111 00001010 00000000,
                                                                                 即爲:-1546188288

$2>m>>n的含義:把整數m表示的二進制數右移n位,m爲正數,高位全部補0;m爲負數,高位全部補1.
實例: 
  3>>2剖析:
  3二進制形式: 00000000 00000000 00000000 00000011,按照$2的原理,得到00000000 00000000 00000000 00000000,即爲0.
  -3>>2剖析:
  -3二進制形式: 11111111 11111111 11111111 11111101,按照$2的原理,得到11111111 11111111 11111111 11111111,即爲-1.

以上:每個整數表示的二進制都是32位的,如果右移32位和右移0位的效果是一樣的。依次類推,右移32的倍數位都一樣。

$3>m>>>n:整數m表示的二進制右移n位,不論正負數,高位都補零。
實例: 
  3>>>2剖析:
  3二進制形式: 00000000 00000000 00000000 00000011,按照$3的原理,得到00000000 00000000 00000000 00000000,即爲0.
  -3>>>2剖析:
  -3二進制形式: 11111111 11111111 11111111 11111101,按照$3的原理,得到00111111 11111111 11111111 11111111,即爲1073741823.

【注】:對於$1,$2,$3,如果n爲負數:這時JVM會先讓n對32取模,變成一個絕對值小於32的負數,然後再加上32,直到 n 變成一個正數。
實例:
   4<<-10
   4的二進制形式:00000000 00000000 00000000 00000100,-10對32取模再加上32,不用說了,得到22,則4<<-10,即相當於4<<22。
   此時按照再按照$1原理,得到00000001 00000000 00000000 00000000,得到的即爲:16777216。

 OK,大功告成。

綜上所述:
   m<<n即在數字沒有溢出的前提下,對於正數和負數,左移n位都相當於m乘以2的n次方.
   m>>n即相當於m除以2的n次方,得到的爲整數時,即爲結果。如果結果爲小數,此時會出現兩種情況:(1)如果m爲正數,得到的商會無條件的捨棄小數位;(2)如果m爲負數,捨棄小數部分,然後把整數部分加+1得到位移後的值。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 接下來在此說說位操作的好處,速度超快,這些都是底層的二進制機器操作指令。
  比如:a*2,

       1.jvm先爲變量a分配空間;

       2.再進行a*2的操作;

      3.再把結果返回給相應的變量。
而a<<1,和a*2一樣,它只需要一條指令即可,速度很快。當然前三種位移操作都是對2的倍數

進行操作時可用。

 

再進行些許補充,談到位操作,當然還要說到四個操作符:~(按位非),|(按位或),&(按位

與),^(按位異或),這些都是大學計算機基礎用法,對整數的二進制形式進行操作,然後再

轉換爲整數,具體操作如下。
1.~(按位非):【解義】對該整數的二進制形式逐位取反。
    ~4:(一元操作符)
     4的二進制形式爲:00000000 00000000 00000000 00000100,逐位取反後得

到:11111111 11111111 11111111 11111011,即爲-5.
2.|(按位或):【解義】對兩個整數的二進制形式逐位進行邏輯或運算,原理爲:1|0=1,0|0=0

等。
    4|-5:
     4的二進制形式爲:00000000 00000000 00000000 00000100,
    -5的二進制形式爲:11111111 11111111 11111111 11111011,
  逐位進行邏輯或運算:11111111 11111111 11111111 11111111,即得到-1.
3.&(按位與):【解義】對兩個整數的二進制形式逐位進行邏輯與運算,原理:1|0=0,0|0=0,1&1=1等。  
   4|-5:
     4的二進制形式爲:00000000 00000000 00000000 00000100,
    -5的二進制形式爲:11111111 11111111 11111111 11111011,
  逐位進行邏輯與運算:00000000 00000000 00000000 00000000,即得到0.   
4.^(按位異或):【解義】對兩個整數的二進制形式逐位進行邏輯異或運算,原理:1^1=0,1^0=1,0^1=1,0^0=0.
   4^-5:
     4的二進制形式爲:00000000 00000000 00000000 00000100,
    -5的二進制形式爲:11111111 11111111 11111111 11111011,
逐位進行邏輯異或運算:11111111 11111111 11111111 11111111,即得到-1.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章