求整數的二進位制表示中1的個數,最直接的方式是求出其二進位制表示,再計算出二進位制表示中1的個數。但是這種方法的效率較低。因為我們只需要統計二進位制表示中1的個數,所以沒有必要將整數先轉化為二進位制,可以在對整數處理的過程中計數。整數轉化為二進位制,除了直接除以2以外,位操作的右移一位可以實現同樣的功能。右移過程中會將最後一們直接丟棄,因此在右移操作之前需要先判斷最後一們是否為1,使用「與」操作可以實現。例如如果n的最後一樣是1,那麼a & 0x01 = 1,否則a & 0x01 = 0。由此可以寫出實現**:
1 #include 23int
main()
412 printf("
%d\n
", s);
13return0;
14 }
對於上述程式還存在可以改進的地方:操作過程中只考慮二進位制表示中的「1」。具體實現如下:
1 #include 23int
main()
412 printf("
%d\n
", s);
13return0;
14 }
然後回覆中的這些**不懂
1你可以試試這幾種演算法,會比你的快n倍。23
#if 0
4 x = (x & 0x55555555) + ((x >> 1) & 0x55555555
); 5 x = (x & 0x33333333) + ((x >> 2) & 0x33333333
); 6 x = (x & 0x0f0f0f0f) + ((x >> 4) & 0x0f0f0f0f
); 7 x = (x & 0x00ff00ff) + ((x >> 8) & 0x00ff00ff
); 8 x = (x & 0x0000ffff) + ((x >> 16) & 0x0000ffff
); 9
#elif 0
10//
mit hackmem count
11 x = x - ((x >> 1) & 0x55555555
);12 x = (x & 0x33333333) + ((x >> 2) & 0x33333333
);13 x = (x + (x >> 4)) & 0x0f0f0f0f
;14 x = x + (x >> 8
);15 x = x + (x >> 16
);16 x &= 0x7f;17
#elif 0
18 x = x - ((x >> 1) & 0x55555555
);19 x = (x & 0x33333333) + ((x >> 2) & 0x33333333
);20 x = (x + (x >> 4) & 0x0f0f0f0f
);21 x = (x * 0x01010101) >> 24;22
#elif 0
23 x = x - ((x >> 1) & 0x55555555
);24 x = (x & 0x33333333) + ((x >> 2) & 0x33333333
);25 x = (x + (x >> 4) & 0x0f0f0f0f) % 255;26
#elif 0 //
faster
27 x = x - ((x >> 1) & 0x77777777) - ((x >> 2) & 0x33333333) - ((x >> 3) & 0x11111111
);28 x = (x + (x >> 4) & 0x0f0f0f0f
);29 x = (x * 0x01010101) >> 24;30
#else
31 x = __builtin_popcount(x); //
for gcc
32#endif
**:
求二進位制數中1的個數
解法一 可以舉乙個八位的二進位制例子來進行分析。對於二進位制操作,我們知道,除以乙個2,原來的數字將會減少乙個0。如果除的過程中有餘,那麼就表示當前位置有乙個1。以10 100 010為例 第一次除以2時,商為1 010 001,余為0。第二次除以2時,商為101 000,余為1。因此,可以考慮利用...
求二進位制數中1的個數
對於乙個位元組 8bit 的變數,求其二進位制表示中 1 的個數,要求演算法的執行效率盡可能地高。解法一 可以舉乙個八位的二進位制例子來進行分析。對於二進位制操作,我們知道,除以乙個2,原來的數字將會減少乙個0。如果除的過程中有餘,那麼就表示當前位置有乙個1。int count int v int ...
求二進位制數中1的個數
對於乙個位元組 8bit 的無符號整型變數,求其二進位制表示中 1 的個數。c codes as below using system class program static void main string args program program new program for int i 0...