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

问题描述 投票:1回答:2

我有一个称为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.
c bit-manipulation bitwise-operators bitwise-and
2个回答
3
投票

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

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

为了简洁,仅显示低4位。


1
投票

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

让我们逐步完成。

计数器:

int c = 0;

循环; i设置了一些位(或为真)时继续:

while( i ) {

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

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

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

    i >>= 1;

循环结束:

}

返回设置的位数:

return c;

推荐问答