int one(int m) { int count = 0; while (m != 0) { if (m % 2 == 1) //進行模2除2一位一位的統計 { count++; } m /= 2; } }
或者下面這種位於運算的
int two(int m) { int count = 0; while (m != 0) { count += m & 1; //進行位於運算統計1的個數原理和上面的一樣但是更安全 m >>= 1; } return count; }
但是這兩種算法都不能避免的要對二進制位中的0進行判斷或者計算,又沒有只與二進制序列中1有關的算法呢? 下面的這種算法就實現了這樣的想法:
int three(int m) { int count = 0; while (m != 0) { count++; m &= m - 1; //位於本身減1的數可以每次去掉一個1 } return count; }
當然第三種算法是最高效的,不過應該還有更為有效的方法。