根据条件应用/删除位掩码

时间:2012-12-28 19:20:57

标签: c bitmask

我想简化以下表达式(block是一个整数,01):

if (block)
    opts = opts & ~O_NONBLOCK;
else
    opts = opts | O_NONBLOCK;

这就是我想出来的:

opts = block ? opts & ~O_NONBLOCK : opts | O_NONBLOCK;
但是,我确信有一种非常聪明的方法可以做到这一点。

3 个答案:

答案 0 :(得分:2)

这个怎么样?

opts = (opts & ~O_NONBLOCK) | (!block * O_NONBLOCK);

但我确实更喜欢你的第一个选项的明确性,而不是这个有点神秘的解决方案。

答案 1 :(得分:2)

你的第一个例子就是尽可能简单,当然更好地解释发生了什么。

如果出于某种原因你迫切想要输入更少的字符,那么可以使用赋值运算符,我想:

if (block)
    opts &= ~O_NONBLOCK;
else
    opts |= O_NONBLOCK;

如果可以避免,我当然不会沿着三元运营商的路线走下去。

答案 2 :(得分:1)

在第一个版本中,您还可以使用运算符的复合赋值版本

if (block)
    opts &= ~O_NONBLOCK;
else
    opts |= O_NONBLOCK;

:)

虽然我通常会尽可能选择?:运营商而不是if运营商。然而在这种特殊情况下,很难说什么看起来更优雅。