一、
int value = Integer.parseInt(“00001111101001011111000010101100″,2);//即value=262533292
對int變數value執行<<32位操作,即value <<=32,這個結果是多少呢。
如果你覺得答案是0,那麼錯了,它的結果還是262533292。
不用懷疑java中int是32位的問題,而是你沒有瞭解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的規則
二、
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) value << (n%32+32)
而對於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) value << (n%64+64)
而對於byte、short、char遵循int的規則。