对于没有第二个条件的循环,即布尔检查?
我必须编写一个函数来计算传入的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与其他部分但没有布尔检查仍然有用,因为您可以使用return
或break
退出它。
最后一件事。 有很多方法可以在不使用<
和>
情况下获取布尔值。 例如,您可以简单地使用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比较的想法似乎是最自然的方式。