今天一個小伙伴說在一個演算法里面看到代碼
x&=(x-1)不明白它的意思,于是我給ta分析了一下,在此分享出來,其實也很好理解,想清就行了,
理解x&=(x-1):
-
單純的去看這些位運算的話,如果不是接觸很多,很難一眼看出它的含義,我們不妨拿幾個數先試試,理解一下它的實際運算程序,這樣就很好理解了,
- 假設x=3,也就是
11, - 那么x-1=2,也就是
10, - 那么此時
x&(x-1)也就等于11&10,根據&的運算規則,相同為1,不同為0,那么運算結果是10,
- 假設x=3,也就是
-
有了上面這個例子,我們大概知道式怎么計算的了,然后我們再從宏觀的角度去理解一下,這里我們就有一個問題了,二進制里面
x-1是怎么算的?- 假設
x二進制位的最后一位是1,那么它減去1后應該是0,變化的只有這一位,那么它再與原來的數相與的話,就是把最后一位由1變成了0, - 假設
x二進制位的最后一位是0,那么它減1的結果就取決于它的上一位,如果它的上一位還是0,那么還要繼續往上找,直到某一位是1為止,減完后,整個數的變化是:這個二進制的最后一個1變成了0,之后的數都變成了1, 那么這個數再與原來那個數相與,變化是:只把最后一個1變成了0,
- 假設
-
綜上所述,
x&=(x-1)的含義是:將 xx 的二進制表示的最后一個 1 變成 0 , -
我們也可以利用這個性質統計出某個二進制數里面1的個數,也就是不斷的進行
x&=(x-1)操作,直到x為0為止,其中操作次數就是這個二進制數里面1的個數,
int count(int x){
int res=0;
while(x>0){
x&=(x-1);
res++;
}
return res;
}
- 這里僅把這個位運算的含義弄清楚,其它的就不多做拓展了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/265909.html
標籤:其他
上一篇:基于大資料技術對基金分析(持續更新)----By Glorio
下一篇:雙非一本一戰跨考哈工深計算機專碩
