n&(n-1)計算比特位1的個數的原理

n&(n-1)統計二進制比特中1的個數spa

unsigned int bitOneCount(unsigned int n)
{
    unsigned int count = 0;
while(0 < n) { n &= (n--); count++; }
return count; }

藍色的是n的初始值,黑色的是當前最新的n-1,也就是上一行的值減1,紅色的是n的當前最新值(n&=(n-1));最後n爲0時中止計算每次循環引用計數加1code

經過下面的演算,咱們發現每次循環事後n最右邊的比特1老是要和比它減1的數相與(例如:100b & 011b = 000b),其結果是n最後一個比特和該比特右邊的都會變成0,也就是最後一個比特1消失;blog

由於任何一個只有1個比特1的數和比它小1的數進行&結果爲這幾個比特全0;可是左邊的則保留,由於左邊的並無發生比特變化。下面每一行的第一行是n,第二行是n-1it

01100110
01100101  循環完一次,引用計數++io


01100100
01100011  循環完一次,引用計數++class


01100000
01011111  循環完一次,引用計數++循環


01000000
00111111  循環完一次,引用計數++;引用


00000000  n>0不成立,再也不進入循環二進制

咱們看到共有4次遞增,引用計數初始爲0,因此計算出比特1的個數爲4,與真實結果相符。統計

相關文章
相關標籤/搜索