有点与布尔值的比较

Che*_*ron 12 c gcc boolean bitwise-operators

假设我有一组标志,用 uint16_t 编码flags。例如,AMAZING_FLAG = 0x02。现在,我有一个功能。这个函数需要检查我是否要更改标志,因为如果我想这样做,我需要写入闪存。那是昂贵的。因此,我想要一个检查,告诉我是否flags & AMAZING_FLAG等于doSet. 这是第一个想法:

setAmazingFlag(bool doSet)
{
    if ((flags & AMAZING_FLAG) != (doSet ? AMAZING_FLAG : 0)) {
        // Really expensive thing
        // Update flags
    }
}
Run Code Online (Sandbox Code Playgroud)

这不是一个直观的 if 语句。我觉得应该有更好的方法,例如:

if ((flags & AMAZING_FLAG) != doSet){

}
Run Code Online (Sandbox Code Playgroud)

但这实际上不起作用,true似乎等于0x01.

那么,有没有一种巧妙的方法可以将一点与布尔值进行比较?

use*_*751 18

To convert any non-zero number to 1 (true), there is an old trick: apply the ! (not) operator twice.

if (!!(flags & AMAZING_FLAG) != doSet){
Run Code Online (Sandbox Code Playgroud)

  • 或者 `(bool)(flags & AMAZING_FLAG) != doSet` ——我觉得更直接。(尽管[this](/sf/ask/2208632191/)表明微软先生对此有疑问。)此外,`((flags & AMAZING_FLAG) != 0)` 可能正是它编译后的结果,并且是绝对明确的。 (4认同)
  • C11 标准,6.3.1.2 布尔类型:“当任何标量值转换为 _Bool 时,如果该值比较等于 0,则结​​果为 0;否则,结果为 1。”。6.5.4 强制转换运算符:“在表达式前面添加带括号的类型名称会将表达式的值转换为命名类型。” (3认同)