【问题标题】:C++ bitwise AND for single bitsC ++按位与单个位
【发布时间】:2014-05-05 09:35:45
【问题描述】:

我有一个关于 C++ 中按位与的简单问题。 我将它用于单个位(a&8、a&4、a&2、a&1 等),我想获得 bool 值作为返回值(如果位置上有 1)。

我可以将它除以一个数字(如 (a&8)/8),但它在我的代码中看起来并不好(尤其是我使用数组和变量的长名称)。

还有其他更好的编码方式吗?

提前致谢。

【问题讨论】:

  • bool bTrue = (a & 8); 应该足够好,甚至bool bTrue = (a & 8) != 0;
  • 有什么问题?你所拥有的应该在正确的上下文中评估为truefalse,而不需要划分或任何其他操作。

标签: c++ bit-manipulation


【解决方案1】:

最好的方法是将表达式转换为布尔值。这提高了可读性:

bool result;
result = 0 != (a & 8);

可能不需要与 0 进行比较,因为编译后的代码会在变量 b 中写入 truefalse。但这避免了类似的警告:

warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning)

如果您不喜欢尤达演讲,顺序或比较参数可能会颠倒。这种风格有助于避免 C 编程语言中的意外赋值。

【讨论】:

  • 感谢大家的回答。 :)
  • @Samik 请注意,bool result = a & 8; 可以。我个人觉得过于冗长的版本令人困惑。而从后到前的尤达风格更是如此:-)
  • 是的,我知道 :) 不过,我必须将这些用作数组中的索引,所以它就像array[(a&8) != 0]。我希望这是最好的解决方案。
【解决方案2】:

如果要显式,与0比较:

const bool maskSet = (a & 8) != 0;

这是我所知道的最干净的方式。除法要奇怪得多,因为这仍然会使从整数到布尔隐式的转换。比较运算符使其明确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 2012-01-28
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    相关资源
    最近更新 更多