一个代码段,用于计算位流中类似1的数量

时间:2017-01-15 06:25:19

标签: c bit-manipulation

我试图计算比特流的连续位数,我有这个代码。我假设,这必须运行,直到数字变为0,然后计数应该返回值。但是为什么没有条件语句将数字等于零(否则我怀疑这可能是一个无限循环),以便执行跳出循环并在计数结束后返回计数值。请不要复制它,因为我只是一个没有足够声誉的孩子来评论任何疑问。

 int count_consecutive_ones(int in) {
     int count = 0;
     while (in)
     {
         in = (in & (in << 1));
         count++;
     }
     return count;
 }

1 个答案:

答案 0 :(得分:0)

首先:代码不计算比特流的连续比特数。比特流中的所有比特都是连续的。这就是所谓的比特流。它计算比特流中连续的数量。不,不是在比特流中,而是在整数中。

让我解释一下:

while(in)
{
  …
}

...是一个while循环,只要条件为真就运行。在C中很长一段时间都没有布尔类型。如果任何类型的表达式不是零的表示,则条件为假,否则为true。对于整数,这意味着0的值为false,其他值都为true。您可以将其视为......

while( in != 0)
{
  …
}

... !=意思是不等。

在循环内你有......:

in = (in & (in << 1));

这有点棘手:它将整数向左移动一位(in << 1),然后用原始值本身计算位和操作。这会在所有地方生成1个,其中1个除了1个。一遍又一遍地执行此操作,将1个放在一边。

因此,您不必迭代这些位来查找前导1,然后是1以下的数字。