今天做了一道題,發現n&=(n-1)這個式子很好奇,然後試著算了一遍發現它竟然能夠快速統計二進位制1的個數,特此拿來分享一下。
首先,分析一下該式子,先可以簡化為
n=n&(n-1);
我們先做乙個例項, n
1234
5678
十進位制123
4567
8二進位制
0001
0010
0011
0100
0101
0110
0111
1000
我們先試著求7中二進位制1的個數k
0111
& 0110
-------------
0110(6)
然後對其結果繼續進行上述操作
0110
& 0101
-------------
0100(4)
繼續上述操作
0100
& 0011
-------------
0000
結束操作。
至此,我們可以發現,每次&操作後,0111(7)的二進位制數中最右邊的1都被消除1個,
第一次&操作後,結果為0110
第二次&操作後,結果為0100
第三次&操作後,結果為0000
而k恰好與&操作的次數是相同的。那麼我們可以猜測這兩者必然存在直接關聯關係。
不過,當二進位制數中1的位置不連續,中間有若干個0這個公式也能「跳過」0,直接統計1的個數嗎?
下面我們在舉個例項37(0010 0101)這個比較有代表性 n
1234
5678
十進位制123
4567
8二進位制
0001
0010
0011
0100
0101
0110
0111
1000
同樣進行&操作,
100101
& 100100(36)
----------------------
100100(36)
繼續重複上述操作
100100
& 100011
--------------------
100000(32)
繼續重複上述操作
100000
& 011111
--------------------
000000
結束。到這裡,我們會得出乙個結論,
1的位置無非就三種情況,頭和中間、尾部
a.在尾部的情況
當末尾是1的時候(奇數),與前乙個數(偶數)進行&操作後,結果必為0,末尾的1消除
b.在頭部的情況
當1只在頭部的時候,其餘位上都為0.類似8(1000),4(0100),與前乙個數(全1,7(0111),3(0011))進行&操作時,結果必為0.
c.在中間的情況
無非也是上述兩種情況的遞迴。保證末尾位為0,因為之前已經處理過尾部的情況了。
比如,尾部是*0010結尾,*0100結尾,*1010結尾,*11010結尾。他們對應的前乙個數分別是:*0001,*0011,*1001,*11001。(*代表左邊還有若干個0和1)
0010
& 0001
-------------
0000
結束。0100
& 0011
-------------
0000
結束。1010
& 1001
--------------
1000(消除最右邊的1,下一步進行第二種情況的處理)
結束。11010
& 11001
---------------
11000(消除最右邊的1,下一步進行第一種情況的處理)
結束。
--------------------------------分割線-------------------------------------
到這裡,我們就可以看出,每次在最右的1設定乙個flag的話,
當它(i)與它前一位(i-1)進行&操作時,對flag左邊的1是沒有影響的,每次得到的結果,就會將flag位置及右邊所有的數置為0.
例如:11010&11001 ==11000(24)
那麼,結束條件是什麼呢?
那就是當&操作後的結果為0,迴圈結束。
好啦,分析就到這裡。下面附上源**供看官們欣賞哈~
for (int count =0; n; ++count)
另一種寫法:
count=0
while(k)
快速統計二進位制中1的個數 分析篇
首先給大家分享乙個巨牛巨牛的人工智慧教程,是我無意中發現的。教程不僅零基礎,通俗易懂,而且非常風趣幽默,還時不時有內涵段子,像看 一樣,哈哈 我正在學習中,覺得太牛了,所以分享給大家!點這裡可以跳轉到教程 今天做了一道題,發現n n 1 這個式子很好奇,然後試著算了一遍發現它竟然能夠快速統計二進位制...
統計二進位制中1的個數
題目 統計乙個無符號數中的二進位制表示中1的個數。此演算法名為平行計算法。基本思想如下 先兩兩 兩個二進位制位 分組統計每組出現的1的個數,而每組1的個數只可能是0個 00 1個 01 或2個 10 由 相加所得的 兩位的二進位制完全可以表示每組 兩個二進位制數 中1的個數 接著四四 4個二進位制位...
二進位制 二進位制中1的個數
題目 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中 1 的個數。例如,把 9 表示成二進位制是 1001,有 2 位是 1。因此,如果輸入 9,則該函式輸出 2。示例 1 輸入 00000000000000000000000000001011 輸出 3 解釋 輸入的二進位制串 0000000...