2013-06-01 75 views
2

我试图检查的标志值的标志可以是一个有点|'D一起。到目前为止,我使用这个检查位标志

if ((someclass.flags | CONST_SOMEFLAG) == someclass.flags) 

检查,如果其真的还是假的,但有没有这样做的更加“优雅”的方式?

回答

0

这将正常工作,但它更传统的使用&:

if (flags & MASK) . . . 

这可能是因为在某些处理器测试寄存器为!= 0的速度比测试与存储值相等的速度要快。

+0

如果'sizeof(flags)> sizeof(long)',这可能不起作用,例如一个32位编译的64位字。原因是按位数学计算的结果将被评估为'int',其将截断高阶位并因此评估为'假'。 –

+0

请参阅c99规范,6.3.1.8p2。如果二元运算符的两个操作数是两个不同的整数大小,那么较小的一个以保留值的方式提升到较大的大小。 –

+0

不幸的是,有大量的c89编译器不符合。 –

2

用位或设置标志,使用按位与测试,如:

if (someclass.flags & CONST_SOMEFLAG) ...

+2

注意,如果给出了'SOMEFLAG'一个以上的位,这将如果任何位被设置返回TRUE;,而OP代码将在所有设置检查。 – Potatoswatter

0

你想知道的是,如果该标志位被置在所有其它可能设置或未置位。该规范的方式做到这一点,是按位与(&)测试是非零

if(someclass.flags & CONST_SOMEFLAG) 
+1

OP是正确的。它会检查设置标志是否会使(总)值保持不变。 – Potatoswatter

+1

他原来的代码会正常工作,这只是非常规的。如果将一个掩码与一个值进行或运算不会改变该值,那么将设​​置掩码位(并且其他位不会被打扰或测试)。 –

+0

@Patatoswatter:是的,你说得对。我删除了错误的陈述。 – datenwolf