对于没有第二个条件的循环,即布尔检查?

时间:2013-06-08 22:28:25

标签: c loops for-loop

我必须编写一个函数来计算传入的unsigned int的log 16的底限。对于允许使用哪些运算符和常量有限制,我们只能使用{{1} }循环。

为清楚起见,我们不能使用任何条件语句(if,else,switch ...)。函数原型是:

for

允许的运营商:int floor_log16(unsigned int x); ++ -- = & | ~ ^ {{1} } <<

允许的常量:! >> 1 2 3 4

我写了一个程序版本如下:

8

似乎按预期工作。但是,我意识到基于后面的函数和我们必须编写的所需功能的描述,我注意到在“允许的运算符”下有时会列出16int floor_log16(unsigned int x) { int index=1; int count=(1!=1); count--; for(; index<=x; index<<=4) { count++; } return count; }

我推断这意味着,因为对于上面列出的>函数,我们没有被明确告知使用<floor_log16,我只能假设上面发布的解决方案将不被接受。

这让我很困惑,因为我不明白你怎么可能有一个没有布尔检查的for循环?

在满足条件的情况下,循环的整个想法是不是要迭代?

3 个答案:

答案 0 :(得分:5)

嗯,首先,没有布尔检查的for - 循环完全没问题。例如,

for (;;)

是一种常见的写作方式

while (true)

其次,使用for - 循环与其他部分但没有布尔检查仍然有用,因为您可以使用returnbreak退出。

最后一件事。在不使用<>的情况下,有很多方法可以获得布尔值。例如,您只需使用i来检查i != 0等等。

例如,如果您想检查a < b,可以检查(a - b) < 0。使用按位运算符实现加法(以及因此减法)是一个众所周知的面试问题(你应该自己尝试这样做,这很有趣),并检查你的int是否为负,就像查看它的最重要一样容易位。

答案 1 :(得分:2)

我不喜欢破坏你的任务,但考虑for条件,比如'与0比较'。这不需要任何明确的运算符。获得它的可能方法之一是这样的:

// This cycle will end as soon as index is 0.
for (;index; index = (index >> 4))
{
    // ...
}

答案 2 :(得分:0)

如果您对自己的无符号进行异或,则它变为0.因此int count=(1!=1);可以更改为int count = 1 ^ 1

至于循环条件,罗曼与0比较的想法似乎是最自然的方式。