c语言 - 一个代码片段,用于计算位流中相似 1 的数量



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

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

首先:代码不计算比特流的连续比特数。比特流中的所有比特都是连续的。这就是它被称为比特流的方式。它统计比特流中连续1的数量。不,不是在比特流中,而是在整数中。

让我解释一下:

while(in)
{
…
}

…是一个while循环,只要其条件为true,它就会运行。很长一段时间以来,在C语言中根本没有布尔类型。如果任何类型的表达式不是零的表示,则条件为false,否则为true。对于整数,这意味着0的值为假,其他每个值都为真。你可以把它读成…

while( in != 0)
{
…
}

…与!=在不相等的意义上。

在循环内你有…:

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

这有点棘手:它将整数向左移动一位(in << 1),然后计算该位并使用原始值本身进行运算。这在所有地方都会产生1,其中1是1。一遍又一遍地这样做,就等于1在一边。

因此,您不必迭代比特来找到前导1,然后找到后面的1的数字。

最新更新