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

我有一个名为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.
mm6yuz 回答:无法确定按位运算背后的原因

程序正在计算给定整数中的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 c;
本文链接:https://www.f2er.com/2989409.html

大家都在问