我试图检查的标志值的标志可以是一个有点|'D一起。到目前为止,我使用这个检查位标志
if ((someclass.flags | CONST_SOMEFLAG) == someclass.flags)
检查,如果其真的还是假的,但有没有这样做的更加“优雅”的方式?
我试图检查的标志值的标志可以是一个有点|'D一起。到目前为止,我使用这个检查位标志
if ((someclass.flags | CONST_SOMEFLAG) == someclass.flags)
检查,如果其真的还是假的,但有没有这样做的更加“优雅”的方式?
这将正常工作,但它更传统的使用&:
if (flags & MASK) . . .
这可能是因为在某些处理器测试寄存器为!= 0的速度比测试与存储值相等的速度要快。
用位或设置标志,使用按位与测试,如:
if (someclass.flags & CONST_SOMEFLAG) ...
注意,如果给出了'SOMEFLAG'一个以上的位,这将如果任何位被设置返回TRUE;,而OP代码将在所有设置检查。 – Potatoswatter
你想知道的是,如果该标志位被置在所有其它可能设置或未置位。该规范的方式做到这一点,是按位与(&)测试是非零
if(someclass.flags & CONST_SOMEFLAG)
OP是正确的。它会检查设置标志是否会使(总)值保持不变。 – Potatoswatter
他原来的代码会正常工作,这只是非常规的。如果将一个掩码与一个值进行或运算不会改变该值,那么将设置掩码位(并且其他位不会被打扰或测试)。 –
@Patatoswatter:是的,你说得对。我删除了错误的陈述。 – datenwolf
如果'sizeof(flags)> sizeof(long)',这可能不起作用,例如一个32位编译的64位字。原因是按位数学计算的结果将被评估为'int',其将截断高阶位并因此评估为'假'。 –
请参阅c99规范,6.3.1.8p2。如果二元运算符的两个操作数是两个不同的整数大小,那么较小的一个以保留值的方式提升到较大的大小。 –
不幸的是,有大量的c89编译器不符合。 –