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的規則源碼