快速統計二進位制中1的個數 分析篇

2021-07-16 18:12:28 字數 2420 閱讀 7107

今天做了一道題,發現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...