分享
三行代码  ›  专栏  ›  技术社区  ›  user23454234123

无法确定按位操作背后的原因

  •  0
  • user23454234123  · 技术社区  · 1 周前

    我有一个函数 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.
    
    2 回复  |  直到 1 周前
        1
  •  3
  •   kaylum    1 周前

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

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

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

        2
  •  1
  •   JL2210    1 周前

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

    让我们一步一步来。

    计数器:

    int c = 0;
    

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

    while( i ) {
    

    如果 设置后,递增计数器:

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

    转移 一个接一个地继续下去;如果 之后为零,不再设置位:

        i >>= 1;
    

    循环结束:

    }
    

    返回设置位数:

    return c;