if(mask&VALUE)或if((mask&VALUE)== VALUE)?

asc*_*ler 36 c++ bitmask

您可能熟悉enum位掩码方案,例如:

enum Flags {
    FLAG1 = 0x1,
    FLAG2 = 0x2,
    FLAG3 = 0x4,
    FLAG4 = 0x8,

    NO_FLAGS = 0,
    ALL_FLAGS = FLAG1 | FLAG2 | FLAG3 | FLAG4
};

f(FLAG2 | FLAG4);
Run Code Online (Sandbox Code Playgroud)

我已经看过很多代码,然后在掩码中测试一下

if ((mask & FLAG3) == FLAG3)
Run Code Online (Sandbox Code Playgroud)

但这不等于这个吗?

if (mask & FLAG3)
Run Code Online (Sandbox Code Playgroud)

有没有理由使用第一个版本?在我看来,第二个较短的版本更清晰.

也许C程序员的剩余习惯应该转换为真正的价值观1?(即使在那里,较长的版本在赋值或return语句中比在条件语句测试中更有意义.)

Dav*_*har 80

该构造if ((mask & FLAG3) == FLAG3)测试FLAG3中的所有位是否存在于掩码中; if (mask & FLAG3)如果测试任何存在.

如果你知道FLAG3只有1位设置,它们是等价的,但是如果你可能定义复合条件,那么就可以更清楚地养成明确测试所有位的习惯,如果这就是你的意思.