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,與真實結果相符。統計