Java移位

 1、
  int value = Integer.parseInt(「00001111101001011111000010101100″,2);//即value=262533292
 
  對int變量value執行<<32位操做,即value <<=32,這個結果是多少呢?
  若是你以爲答案是0,那麼錯了,它的結果仍是262533292。
  不用懷疑java中int是32位的問題,而是你沒有了解java的<<操做。
  在java中不管左移右移,會遵循下面的規則java

  value<<n(其中value爲int,n>=0) 等價於 value<<(n%32)
  value>>n (其中value爲int,n>=0) 等價於 value>>(n%32)
  value>>>n (其中value爲int,n>=0) 等價於 value>>>(n%32)
 
  對於long類型的:
  value<<n(其中value爲long,n>=0) 等價於 value<<(n%64)
  value>>n (其中value爲long,n>=0) 等價於 value>>(n%64)
  value>>>n (其中value爲long,n>=0) 等價於 value>>>(n%64)
 
  而對於byte、short、char遵循int的規則
 
 2、
  int value = Integer.parseInt(「00001111101001011111000010101100″,2);//即value=262533292
  value <<= -38,這個結果是多少呢?
  你可能認爲它通不過編譯,抑或你認爲它從左移變成右移了?
  然而,事實不是想象的那麼簡單,它的結果是-1342177280,這是怎麼出來的?聽我一一道來。
  如果對int的值移負數位,java會截取那個負數的低5位。
  -38的二進制表示是:11111111111111111111111111011010,截取低5位得:11010,這個數是26,也就是說:
  value <<= -38 等價於 value <<= 26,獲得的二進制是10110000000000000000000000000000,首位爲1,
  因此該二進制是補碼,換成其絕對值的源碼爲01010000000000000000000000000000,對應的十進制爲1342177280,
  加上負號就是-1342177280。
  對於int是取低5位,對於long是取低6位
  也就是說:
   value << -n(value爲int,n>=0) 等價於 value << (-n & 31)
   value >> -n(value爲int,n>=0) 等價於 value >> (-n & 31)
   value >>> -n(value爲int,n>=0) 等價於 value >>> (-n & 31)
 
  而對於long
   value << -n(value爲long,n>=0) 等價於 value << (-n & 63)
   value >> -n(value爲long,n>=0) 等價於 value >> (-n & 63)
   value >>> -n(value爲long,n>=0) 等價於 value >>> (-n & 63)
  
  而對於byte、short、char遵循int的規則源碼

相關文章
相關標籤/搜索