Java移位運算符總結

本文參考:java移位運算符詳解html

Java移位運算符有三種

  • << 左移運算符,value<<num
  • >> 右移運算符,value>>num
  • >>> 無符號右移運算符, value>>>num

<< 左移運算符。(value<<num)

2 << 1  // 4

至關與2*2,即將2(value)化爲2進制,再向左移移1(num)位,即: 00000010,將1向左移移1位:00000100,化爲十進制爲4。java

10 << 20

這個相比上個複雜點,但運算方法同樣。即:00001010 = 2三次方+2一次方,中的每一個1都向左移20位。 即: 輸入圖片說明 = 10485760code

>> 右移運算符 (value>>num)

道理和和左移差很少,只不過是反方向。將1向右移num位,其餘空位所有補0.htm

>>> 無符號右移 (value>>num)

當value是整數時,這種移位方式和‘>>’是同樣的。可是當value時負數時則結果徹底相反。>>>是無論value轉換爲2進制後的正負號的,他只管移位,移位後的結果均爲整數。看個例子blog

2>>>1 // 結果爲1
-2>>>1 //結果爲2147483647

若是你和博主同樣對結果的差異感到震驚的時候,說明你忘了二進制的負數表達方式。圖片

  • 二進制的負數:能被計算機正確識別的是該數補碼.(什麼?又忘記了什麼是補碼?)。
  • 補碼:該數的反碼加1。
  • 反碼:原碼取反。(即0 -> 1 ,1 -> 0)。
  • 原碼:符號位加上真值的絕對值,-1->10000001(什麼?不知道什麼是絕對值。來,把你的初中體育老師叫來,他怎麼教你數學的!)。
  • 關於原碼,補碼,反碼的詳細解釋戳這裏

這裏你應該知道-2 的二進制爲 111111111111111111111101,再右移後的結果可想而知。get

總結

  • 在數字沒有溢出的前提下,對於正數和負數,左移一位都至關於乘以2的1次方,左移n位就至關於乘以2的n次方.
  • 右移一位至關於除2,右移n位至關於除以2的n次方。
  • 無符號右移的規則只記住一點:忽略了符號位擴展,0補最高位,無符號右移運算符>>> 只是對32位和64位的值有意義

本次總結就到這裏,歡迎吐槽。數學

相關文章
相關標籤/搜索