Java位運算實用技巧

1. Java支持的位運算符:&:按位與|:按位或~:按位非(Esc下面那個鍵)^:按位異或<<:有符號左位移運算符>>:有符號右位移運算符>>>:無符號右位移運算符由於Java在表示二進制數時採用的是補碼(2's complement)的形式,最高位爲符號位,即負數爲1,非負數爲0。無符號右位移運算會直接在高位補0,而有符號右位移運算符會根據當前符號位的數字決定高位補0或1以保證結果正負性不變。2.位運算適用的幾個平常情境1).求整數m與2的n次冪的乘積,即m*(2^n)可直接使用 m<<n 得到結果,如: jshell> int a = 7<<2 //a = 7*(2^2) = 7*4 a ==> 28 jshell>int b = 6<<1 //b = 6*(2^1) = 6*2 b ==> 12 注意,任何數左(右)位移32位或32的整數倍位所得的結果與原數字相同2).求整數m對2的n次冪取餘的結果,即m%(2^n)可直接使用 m&((1<<n)-1) 得到結果,如: jshell> int a = 19&((1<<4)-1) //a = 19%(2^4) = 19%16 a ==> 3 3).判斷整數m的奇偶性,即m%2==1?奇數:偶數可直接使用 (m&1)==1?奇數:偶數 得到結果,如: jshell> boolean a = (3&1)==1 a ==> true jshell> boolean b = (4&1)==1 b ==> false 4).不用臨時變量交換兩個整數的值連續使用三次異或,得到結果,如: jshell> int a = 3, b = 4 a ==> 3 b ==> 4 jshell> a = a^b a ==> 7 jshell> b = a^b b ==> 3 //交換後的b jshell> a = a^b a ==> 4 //交換後的a 原理:異或0具備保持的特色,即1010^0000 = 1010;異或1具備翻轉的特色,即1010^1111 = 0101;由此可推導:b^(a^b) = aa^(b^(a^b)) = b5).取整數m的絕對值,即Math.abs(m)可直接使用 (m^(m>>31))-(m>>31) 得到結果,如: jshell> int a = (-3^(-3>>31))-(-3>>31) a ==> 3 jshell> int b = (5^(5>>31))-(5>>31) b ==> 5 原理:m>>31可取出整數m的最高位,即符號位。若符號位爲0,則m爲非負數,m異或0,m不變,再減去0,m仍不變若符號位爲1,則m爲負數,m異或1,m每位翻轉,再減去1,根據補碼的定義,負數m變爲正數-m 複製代碼

歡迎加入學習交流羣569772982,你們一塊兒學習交流。
shell

相關文章
相關標籤/搜索