没有第二个条件的for循环,即布尔检查是什么?

6

我需要编写一个函数来计算传入的无符号整数的以16为底的对数的最大整数值。我们有使用哪些运算符和常量的限制,并且只能使用特定的for循环。

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

int floor_log16(unsigned int x); 

Allowed operators: ++ -- = & | ~ ^ << ! >>

Allowed constants: 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循环呢?

难道循环的整个想法不是在满足条件的情况下进行迭代吗?


出于兴趣,您可以使用for循环来创建一个if语句,因此if语句的限制有些微不足道(同样适用于else)- if(condition) statement; = for(;condition;) {statement; break;},但我不认为这是您要做的。 - Bernhard Barker
也许可以尝试使用类似 for(;x;x>>4) 的语法?这样当 x == 0 时循环将停止。 - Soufiane Hassou
“我不明白你怎么可能有一个没有布尔检查的for循环?”-- for循环本身会进行布尔检查...它根据表达式的值继续或结束。“难道循环的整个想法不是在满足条件的同时迭代吗?”-- 不,它是在表达式非零的情况下迭代。如果您实际阅读文档而不是哲学思考“整个想法”,这一点将变得清晰。请注意,具有正确智力技能的学生将获得更好的成绩并获得工作机会。 - Jim Balter
int count = (1 != 1) ... "!=" 不是允许的运算符。index <<= 4 ... 也不是允许的运算符,但 index = index << 4 是可以的。 - Jim Balter
我认为允许的运算符已经足以完成这个任务。 - Ken Kin
3个回答

5

首先,没有布尔检查的for循环是完全可以接受的。例如:

for (;;)

是一种常见的编写方式。

while (true)

其次,具有其他部分但没有布尔检查的for循环仍然是有用的,因为您可以使用returnbreak退出它。
最后一点。有无数种方法可以在不使用<>的情况下获取布尔值。例如,您可以简单地使用i来检查i!=0等等。
例如,如果要检查a < b,则可以检查(a-b) < 0。使用位运算符实现加法(因此也是减法)是众所周知的面试问题(您应该真正尝试自己做,这很有趣),检查您的int是否为负数就像查看其最高有效位一样容易。

在注意到其他人正在根据您的确切任务回答问题之后,我只想指出,我在上一段中所说的只是位运算符的强大功能的一般演示。对于您的特定任务来说,这太复杂了,可以更轻松地解决。 - kirelagin

2

我不想破坏你的任务,但考虑到像“与0进行比较”的for条件。这不需要任何显式运算符。可能的一种实现方式如下:

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

0

如果你将任何无符号数与自身进行异或运算,结果都会变成0。因此,int count=(1!=1);可以改为int count = 1 ^ 1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接