【问题标题】:Unable to determine the reasoning behind a bitwise operation无法确定按位运算背后的原因
【发布时间】:2019-12-03 00:14:50
【问题描述】:

我有一个名为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的位数。

标签: c bit-manipulation bitwise-operators bitwise-and


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    让我们一步一步来。

    计数器:

    int c = 0;
    

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

    while( i ) {
    

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

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

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

        i >>= 1;
    

    循环结束:

    }
    

    返回设置的位数:

    return c;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 2014-09-16
      • 2021-06-01
      • 2015-05-11
      相关资源
      最近更新 更多