6

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

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

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;
}

这似乎可以按需要工作。但是,我意识到,基于后面的功能和我们必须编写的所需功能的描述,我注意到有时在“允许的运算符”下>并被<列出。

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

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

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

4

3 回答 3

5

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

for (;;)

是一种常见的写法

while (true)

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

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

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

于 2013-06-08T22:36:44.577 回答
2

我不喜欢破坏你的任务,但考虑for像“与 0 比较”这样的条件。这不需要任何显式运算符。获得它的一种可能方法是这样的:

// This cycle will end as soon as index is 0.
for (;index; index = (index >> 4))
{
    // ...
}
于 2013-06-08T22:40:27.573 回答
0

如果您将任何无符号与自身进行异或,则它变为 0。因此int count=(1!=1);可以更改为int count = 1 ^ 1.

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

于 2013-06-09T14:12:09.710 回答