我想在单个语句中清除并测试特定位,例如清除位27并测试同一位,并想返回相同位的状态:
{ status = number & BIT(27); if (status) number & ~BIT(27); return number & BIT(27); }
有没有办法做到这一点使用三元运算符?
6g8kf2rb1#
该代码片段没有修改number,因此它将返回位值,但不会清除它。您可能是指:
number
{ status = number & BIT(27); if (status) number &= ~BIT(27); return status; }
实际上,您可以使用三元运算符和逗号表达式在单个表达式中实现这一点:
return (number & BIT(27)) ? (number &= ~BIT(27), BIT(27)) : 0;
或此替代方案:
return (number & BIT(27)) ? (number ^= BIT(27), BIT(27)) : 0;
在测试表达式的求值和第二个或第三个表达式的求值之间有一个序列点,因此可以这样修改number,这是一个副作用。这种方法可以让你把测试和清除技巧封装在一个表达式宏中,但是要注意这个宏会计算number两次,你可以考虑使用一个内联函数来获取number的地址:
static inline int test_and_clear27(int *number) { return (*number & BIT(27)) ? (*number ^= BIT(27), BIT(27)) : 0; }
此方法不是线程安全的:它不能用于实现信号量,因为测试和清除操作是分离的并且不是原子地发生的。
1条答案
按热度按时间6g8kf2rb1#
该代码片段没有修改
number
,因此它将返回位值,但不会清除它。您可能是指:实际上,您可以使用三元运算符和逗号表达式在单个表达式中实现这一点:
或此替代方案:
在测试表达式的求值和第二个或第三个表达式的求值之间有一个序列点,因此可以这样修改
number
,这是一个副作用。这种方法可以让你把测试和清除技巧封装在一个表达式宏中,但是要注意这个宏会计算
number
两次,你可以考虑使用一个内联函数来获取number
的地址:此方法不是线程安全的:它不能用于实现信号量,因为测试和清除操作是分离的并且不是原子地发生的。