在java的數字運算中,我們一般會去考慮的運算的效率問題,所以儘可能的使用位移運算,因爲位移運算效率高。
下面分享一個就int型數絕對值的代碼,其他的可以類似借鑑這個。先上代碼:
public int getAbsolute(int para){
return para*(1-((para>>>31)<<1));
}
沒錯,就這麼一點。
具體原理:
: int 型的數是採用4個字節存儲的,即32位,第一位,用作符號位,接下來31位來表示數字部分。如果第一位爲0,就是正數,如果第一位爲1,就是負數。
所以我們使用 無符號右移 >>> 直接得到符號位的值,然後再左移1位, 如果是0,那麼1-0=1,乘以本身,爲正; 如果符號爲1,那麼左移後就是2,1-2=-1,與原來負數想乘,又變爲正了。
以上爲自己的個人見解,歡迎大神給出高級的。
但自己有個疑問:
爲什麼 (para<<1)>>>1 這樣不行?先左移,把前面符號位給清除,然後再無符號位右移一下。