java 位運算 之 左移和右移理解


<<(左移),>>(右移)皆屬於位運算符.其運算比乘除快,所以我們可以用其優化代碼。

 

<<左移
規則則是帶符號位移,高位移出,低位補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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM