【问题标题】:Bitwise & evaluation [closed]按位和评估[关闭]
【发布时间】:2016-11-25 23:48:59
【问题描述】:

对于下面的示例代码:

// Note that a, b, c and d can have value of 0 or 1 only
int isAllTrue(int a, int b, int c, int d)
{
   return (a && b && c && d);

   // THIS ALSO RETURNS CORRECT VALUE
   // return (a & b & c & d);
}

如果我们知道操作数可以是 0 或 1,从性能的角度来看,哪种操作更可取:按位还是逻辑?真的很重要吗?

当操作数为0时,按位“&”是否停止计算?

【问题讨论】:

  • 看看[ this ]的答案。
  • (10 & 5 & 3) = 0, (10 && 5 && 3) = 1 所以'bitwise'和'conditional and'表达式不能互换 .
  • @DavidC.Rankin 问题是关于已知操作数为 0 或 1 的情况。
  • @tbetous StackOverflow 以标签为中心。无法使用不同语言的标签关闭重复项。因此,在将来提出作为重复问题结束时请尊重这一点

标签: c bit-manipulation


【解决方案1】:

使用 & 进行位运算。使用 && 进行逻辑运算。如果您使用按位运算而应该使用逻辑运算,反之亦然,读者会 (a) 感到困惑,(b) 非常仔细地检查您的代码是否引入了细微的错误。

编程依赖于成语。如果您的代码与预期的习惯用法不符,那么您一定有充分的理由,并且您应该写注释说明原因。

【讨论】:

    【解决方案2】:

    无论您使用哪种公式,通过积极的编译器优化,所有显示的评估都应该在编译时完成。

    至于你的最后一个问题,按位运算符不使用快捷评估,因此总是评估每个操作数。

    【讨论】:

      【解决方案3】:

      对于像这样的问题似乎有很多困惑......以及很多错误的答案。好吧,以下是事实C/C++

      • &&, || and !logical 运算符,他们测试 boolean 表达式 - 如果整数值(数字)不为零,则将其视为 true,否则视为 false - 无论您检查多少个数字,但 0 && 1 将被评估为 false,例如因为第一个 0 - 它可以重写为 false && true
      • &, |, ~, ^, >>, <<bitwise 运算符,它们屏蔽/赋值 整数值的位模式,您可以进行很多很酷的计算 - 但在开始之前,您确实需要知道数字在 CPU 内部的表示方式。

      结论:你的问题没有意义 - 因为你认为这些运算符是相似的......他们不是。

      【讨论】:

      • 这个问题对于每个使用所有零位表示整数 0 的实现来说都是完全明智的,这是......其中的大多数。事实上,唯一合理的例外可能是使用有符号幅度表示的实现,但即使在那里,显示的声明也可能会创建“正”0,即按位仍为全零。因此,与其讲授运算符类型之间的区别(看起来 OP 已经理解),为什么不检查边缘情况和/或位表示的微妙之处?
      • “在你开始之前,你真的需要知道数字在你的 CPU 中是如何表示的”——顺便说一句,你不需要。您需要了解您使用的编程语言所建立的规则。硬件中的表示并不有趣(尽管它通常与编程语言的规则兼容)。
      猜你喜欢
      • 1970-01-01
      • 2014-06-11
      • 2016-11-26
      • 1970-01-01
      • 2019-06-08
      • 1970-01-01
      • 1970-01-01
      • 2010-12-22
      • 1970-01-01
      相关资源
      最近更新 更多