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

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

为清楚起见,我们不能使用任何条件语句(如果,否则,切换…)。 function原型是:

 int floor_log16(unsigned int x); 

允许的运算符: ++ -- = & | ~ ^ << ! >>

允许的常数: 1 2 3 4 8 16

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

 int floor_log16(unsigned int x) { int index=1; int count=(1!=1); count--; for(; index<=x; index<<=4) { count++; } return count; } 

这看似按预期工作。 但是,我意识到基于后面的函数和我们必须编写的所需function的描述,我注意到在“允许的操作符”下有时><被列出。

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

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

在条件满足时,不是循环迭代的整个想法吗?

好吧,首先,没有布尔检查的-loop非常好。 例如,

 for (;;) 

是一种常见的写作方式

 while (true) 

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

最后一件事。 有很多方法可以在不使用<>情况下获取布尔值。 例如,您可以简单地使用i来检查i != 0 ,依此类推。

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

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

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

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

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