【问题标题】:For loop without the second condition, i.e. the boolean check?没有第二个条件的循环,即布尔检查?
【发布时间】:2013-06-04 23:09:18
【问题描述】:

我必须写一个函数来计算传入的无符号整数的log base 16的下限。对于我们允许使用哪些运算符和哪些常量有限制,我们只能专门使用for循环.

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

int floor_log16(unsigned int x); 

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

允许的常量:1234816

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

int floor_log16(unsigned int x) {
    int index=1;
    int count=(1!=1);

    count--;

    for(; index<=x; index<<=4) {
        count++;
    }

    return count;
}

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

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

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

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

【问题讨论】:

  • 出于兴趣,您可以使用 for 循环创建一个 if 语句,因此 if 语句的限制有些微不足道(类似于 else) - if (condition) statement; = for(;condition;) {statement; break;} ,但我不认为你应该这样做。
  • 可能类似于 for(;x;x&gt;&gt;4)x == 0 时会停止
  • “我不明白你怎么可能有一个没有布尔检查的 for 循环?” -- for 循环本身进行布尔检查......它根据表达式的值继续或结束。 “在满足条件时循环迭代的整个想法不是吗?” -- 不,它是在表达式非零时进行迭代。如果您要实际阅读文档而不是对事物的“整体想法”进行哲学思考,这对您来说会很清楚。考虑到具有适当智力技能的学生将获得更好的成绩并获得工作。
  • int count = (1 != 1) ... "!=" 不是允许的运算符。 index &lt;&lt;= 4 ... 也不是允许的运算符,但index = index &lt;&lt; 4 可以。
  • 我认为允许的操作符已经足够完成这个任务了。

标签: c loops for-loop


【解决方案1】:

如果你对任何未签名的自身进行异或运算,它会变为 0。因此 int count=(1!=1); 可以更改为 int count = 1 ^ 1

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      for (;;)
      

      是一种常用的写法

      while (true)
      

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

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

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

      【讨论】:

      • 在注意到其他人正在根据您的确切任务回答问题后,我只想指出,我在上一段中所说的只是对位运算符功能的一般演示。这对于您的特定任务来说太复杂了,而且可以更轻松地解决。
      猜你喜欢
      • 2017-12-26
      • 2016-01-14
      • 1970-01-01
      • 2013-12-12
      • 2014-04-26
      • 2013-09-23
      • 1970-01-01
      • 2013-05-15
      • 2019-03-01
      相关资源
      最近更新 更多