单行表达式分支和清除布尔标志?

时间:2012-11-27 17:19:03

标签: c bit-manipulation

前几天,一位同事注意到他正在做的共同模式:

if (someBooleanFlag)
{
    someBooleanFlag = FALSE;
    ...do some more stuff...
}

基本上是一个清除读取锁存器。并且问我是否知道一种聪明的方法来测试旗帜并将其清除为单线,因此他可以摆脱样板someBooleanFlag = FALSE;位。关于这是否是好风格的问题,我发现我能为他做的最好的事情就像是

#define TESTANDCLEAR(var) (var ? var-- : 0)

这假设只使用1和0,并且它也不能在位掩码上工作。我想我会转向堆栈的向导,看看是否有更好的方法和其他可以使用的技术。

(同样,不需要讨论做TESTANDCLEAR()表达的风格是坏还是好,如果我们真的能做到这一点,那就更多的是学术练习,以及如何做到这一点)

2 个答案:

答案 0 :(得分:4)

我认为你不需要做出0/1假设,即使你已经采用了这种方法。赋值是返回值的表达式,因此您可以将该宏定义为:

(var ? !(var = false) : false)

或者,您可以使用逗号运算符:

(var ? ((var = false), true) : false)

如果您希望将其用于N位的位域测试,那将有所帮助:

(((var & (1 << N)) ? ((var = var & ~(1 << N)), true) : false)

答案 1 :(得分:3)

丑陋,但我认为这应该有效:

if (someBooleanFlag && !(someBooleanFlag = !someBooleanFlag))

因为对上帝的爱永远不会在生产代码中这样做。