无法确定按位运算背后的原因

Unable to determine the reasoning behind a bitwise operation

我有一个名为 aFunc() 的函数,它正在执行一些按位运算。我了解该程序在做什么,但我无法确定这样做的原因是什么。我将此函数的值从 0 传递到 49,但我仍然无法总结此函数的用途。你对这个功能的作用有什么建议吗?绝对不是 1 或 2 的补码。

int afunc( unsigned int i ) {
    int c = 0;
    while( i ) {
        if( i & 1 ) { c++; }
        i >>= 1;
    }
    return c;
}

for (int i = 0; i < 50; i++)
{   
    printf("%d returns %d.\n", i, afunc(i));
}  

输出如下:

0 returns 0.
1 returns 1.
2 returns 1.
3 returns 2.
4 returns 1.
5 returns 2.
6 returns 2.
7 returns 3.
8 returns 1.
9 returns 2.
10 returns 2.
11 returns 3.
12 returns 2.
13 returns 3.
14 returns 3.
15 returns 4.
16 returns 1.
17 returns 2.
18 returns 2.
19 returns 3.
20 returns 2.
21 returns 3.
22 returns 3.
23 returns 4.
24 returns 2.
25 returns 3.
26 returns 3.
27 returns 4.
28 returns 3.
29 returns 4.
30 returns 4.
31 returns 5.
32 returns 1.
33 returns 2.
34 returns 2.
35 returns 3.
36 returns 2.
37 returns 3.
38 returns 3.
39 returns 4.
40 returns 2.
41 returns 3.
42 returns 3.
43 returns 4.
44 returns 3.
45 returns 4.
46 returns 4.
47 returns 5.
48 returns 2.
49 returns 3.

程序正在计算给定整数中 1 的位数。

0 = b0000 => 0 one bits
1 = b0001 => 1 one bits
2 = b0010 => 1 one bits
...

为简洁起见,仅显示低 4 位。

它计算整数中设置位的数量。

让我们逐步完成它。

计数器:

int c = 0;

循环;而 i 已设置位(或为真)继续:

while( i ) {

如果设置了i的低位,增加计数器:

    if( i & 1 ) { c++; }

i右移一位以继续下一位;如果在此之后 i 为零,则不再设置位:

    i >>= 1;

循环结束:

}

return设置位数:

return c;