求二進位制數中1的個數

2022-04-11 09:38:12 字數 1913 閱讀 9954

求整數的二進位制表示中1的個數,最直接的方式是求出其二進位制表示,再計算出二進位制表示中1的個數。但是這種方法的效率較低。因為我們只需要統計二進位制表示中1的個數,所以沒有必要將整數先轉化為二進位制,可以在對整數處理的過程中計數。整數轉化為二進位制,除了直接除以2以外,位操作的右移一位可以實現同樣的功能。右移過程中會將最後一們直接丟棄,因此在右移操作之前需要先判斷最後一們是否為1,使用「與」操作可以實現。例如如果n的最後一樣是1,那麼a & 0x01 = 1,否則a & 0x01 = 0。由此可以寫出實現**:

1 #include 2

3int

main()

412 printf("

%d\n

", s);

13return0;

14 }

對於上述程式還存在可以改進的地方:操作過程中只考慮二進位制表示中的「1」。具體實現如下:

1 #include 2

3int

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...