我必须编写一个函数来计算传入的unsigned int的log 16的底限。对于允许使用哪些运算符和常量有限制,我们只能使用{{1} }循环。
为清楚起见,我们不能使用任何条件语句(if,else,switch ...)。函数原型是:
for
允许的运营商:int floor_log16(unsigned int x);
++
--
=
&
|
~
^
{{1} } <<
允许的常量:!
>>
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;
}
。
我推断这意味着,因为对于上面列出的>
函数,我们没有被明确告知使用<
或floor_log16
,我只能假设上面发布的解决方案将不被接受。
这让我很困惑,因为我不明白你怎么可能有一个没有布尔检查的for循环?
在满足条件的情况下,循环的整个想法是不是要迭代?
答案 0 :(得分:5)
嗯,首先,没有布尔检查的for
- 循环完全没问题。例如,
for (;;)
是一种常见的写作方式
while (true)
其次,使用for
- 循环与其他部分但没有布尔检查仍然有用,因为您可以使用return
或break
退出。
最后一件事。在不使用<
和>
的情况下,有很多方法可以获得布尔值。例如,您只需使用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比较的想法似乎是最自然的方式。