我试图计算比特流的连续位数,我有这个代码。我假设,这必须运行,直到数字变为0,然后计数应该返回值。但是为什么没有条件语句将数字等于零(否则我怀疑这可能是一个无限循环),以便执行跳出循环并在计数结束后返回计数值。请不要复制它,因为我只是一个没有足够声誉的孩子来评论任何疑问。
int count_consecutive_ones(int in) {
int count = 0;
while (in)
{
in = (in & (in << 1));
count++;
}
return count;
}
答案 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以下的数字。