<<(左移),>>(右移)皆屬於位運算符.其運算比乘除快,所以我們可以用其優化代碼。
<<左移
規則則是帶符號位移,高位移出,低位補0,移動位數超過該類型的最大位數,則進行取模,如對Integer型左移34位,實際上只移動了兩位。左移一位相當於乘以2的一次方,左移n位相當於乘以2的n次方。
Integer i = 7; message(Integer.toBinaryString(i)); int moveNum = 3; message(i << moveNum); message(Integer.toBinaryString(i << moveNum)); 輸出結果 the value is :111 the value is :56 the value is :111000
從上面代碼可以看出確實能證明,左移n為,相當於乘以2的n次方。如何驗證其帶符號位位移呢?看下面的例子
Integer i = 1; message(Integer.toBinaryString(i)); int moveNum = 31; message(i << moveNum); message(Integer.toBinaryString(i << moveNum)); 輸出結果 the value is :1 the value is :-2147483648 the value is :10000000000000000000000000000000
從上面的輸出結果可以看出,左移確實是帶着符號位移動,向左移動了31位,1就移動到了最前面,也就是符號位上,得到了一個特殊的值,也就是-0的補碼,用來代表-2的3次方。如果這個不懂,可以去看下源碼反碼補碼的博客.
Integer i = -7; message(Integer.toBinaryString(i)); int moveNum = 33; message(i << moveNum); message(Integer.toBinaryString(i << moveNum)); 輸出結果 the value is :11111111111111111111111111111001 the value is :-14 the value is :11111111111111111111111111110010
由上面的代碼可以看出,我們左移的位數是33位,實際上卻只左移了1位,證實了上面所說的移動位數超過該類型的最大位數,則進行取模
>>右移
規則則是低位移出,高位補符號位,移動位數超過該類型的最大位數,則進行取模,如對Integer型左移34位,實際上只移動了兩位。
Integer i = -7; message(Integer.toBinaryString(i)); int moveNum = 1; message(i >> moveNum); message(Integer.toBinaryString(i >> moveNum)); 輸出結果 the value is :11111111111111111111111111111001 the value is :-4 the value is :11111111111111111111111111111100
上面的二進制都是補碼的形式,不要疑惑這個。可以看出上面的二進制代碼,向右移動一位,然后在其高位補符號位,正數補0,負數補1.
Integer i = 7; message(Integer.toBinaryString(i)); int moveNum = 34; message(i >> moveNum); message(Integer.toBinaryString(i >> moveNum)); 輸出結果 the value is :111 the value is :1 the value is :1
上面的代碼,左移34位,實際上卻只左移了兩位,已經做過取模了。由於是正數,高位補0。
>>> 無符號右移
無符號位移是什么意思呢,就是右移的時候,無論正負數,高位始終補0。當然,它也僅僅針對負數計算有意義。
Integer i = -7; message(Integer.toBinaryString(i)); int moveNum = 1; message(i >>> moveNum); message(Integer.toBinaryString(i >>> moveNum)); 輸出結果 the value is :11111111111111111111111111111001 the value is :2147483644 the value is :1111111111111111111111111111100
上面代碼中,右移一位后的值,其高位省略了一位0,我們來計算其值。
就是2的31次方 - 1 - 2º-2¹,其結果為2147483644
<<< 無符號左移
為什么沒有這個呢?大家可以想一下。
————————————————
原文:https://blog.csdn.net/koreyoshi326/java/article/details/85008708