【问题标题】:Better style to use bitwise vs comparison in certain cases?在某些情况下使用按位与比较的更好风格?
【发布时间】:2022-06-30 13:32:25
【问题描述】:

只是想知道编写这样的代码是否更好/更有效:

if (bitset[index] & 1)
{
//do something
}

与:

if (bitset[index] == 1)
{
//do something
}

谢谢!

  • 这两段代码不等价
  • 他们都返回 1 不是吗?
  • 不,首先检查第一位是否为 1 和其他 - 可以是任何东西,第二 - 检查第一位是否为 1,其他位是否为零
  • 我很确定它们是等效的 - bitset[index] 返回一位,您可以将该位与 1 进行比较,即 0001,因此如果该位为 1,它将返回 1
  • 无论如何,并非所有语言都有位集,如果我们谈论 c++,那么 - 两者都应该编译成相同的指令(但在最坏的情况下,第一个会更长,因为 AND 然后比较),风格明智 - 第二个是更具可读性并显示意图

标签: optimization comparison bit-manipulation bitwise-operators bitset


【解决方案1】:

以上都不是。在 cmets 中,您正在谈论类似 C++ 的 std::bitset,其 operator[] 返回 bool。通常,布尔值仅与其他布尔值一起使用布尔运算(&&||! 等)进行运算。将它与另一种类型的对象(例如整数 1)进行比较,或者应用整数算术运算(如 & | + - 等)似乎很奇怪。语言的转换规则允许你这样做,但它没有那么多逻辑意义。

所以最惯用,也是最紧凑的版本是:

if (bitset[index]) {
    // ...
}

如果在上下文中将测试视为相等比较更有意义,那么您可以:

if (bitset[index] == true) {
    // ...
}

但对于大多数 C++ 程序员来说,这看起来是多余的。

从优化的角度来看,这一切都无关紧要;任何合理的编译器都会意识到它们都是等价的并同样优化它们。但是,一般来说,如果您正在做一些常见的事情,那么您通常会通过以最常见和惯用的方式编写它来获得最佳优化,因为这是编译器最有可能处理好的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多