我试图计算比特流的连续比特数,我有这样的代码。我假设,这必须运行,直到数字变为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的数字。