C 根据情况应用/删除位掩码

C 根据情况应用/删除位掩码,c,bitmask,C,Bitmask,我想简化以下表达式(block是一个整数,0或1): 这就是我想到的: opts = block ? opts & ~O_NONBLOCK : opts | O_NONBLOCK; 然而,我确信有一种非常聪明的方法可以做到这一点。这个怎么样 opts = (opts & ~O_NONBLOCK) | (!block * O_NONBLOCK); 不过,我确实更喜欢第一个选项的明确性,而不是这个有点神秘的解决方案。在第一个版本中,您也可以使用运算符的复合赋值版本 if (blo

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

这就是我想到的:

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

这个怎么样

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

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

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

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


尽管我通常更喜欢
?:
操作符而不是
if
,只要可能和合适。然而,在这种特殊情况下,很难说什么看起来更优雅。

您的第一个示例尽可能简单,当然更能解释发生了什么

如果出于某种原因,您非常想键入更少的字符,我想您可以使用赋值运算符:

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

如果可以避免的话,我当然不会使用三元运算符。

调试的难度是一开始编写三元运算符的两倍。如果你写得尽可能巧妙的话……:-))你说得对!我不认为我会使用“最聪明”的解决方案,但实际上我只是好奇。@shiplu.mokadd.im它会根据是否设置了
block
来清除或设置
O非block
位。系数应该是
(1-block)
,而不是
block
(这说明了密码的隐蔽性;).Ta。已将其修复为使用
!而不是block
。我想我是在找类似的东西。真的很神秘,这是肯定的!也行。不过可能会引入一个分支。(我不知道指令集。如果有专门的指令,可能比
1-block
更快)我接受了你的解决方案,因为它似乎是最紧凑的解决方案。不过,我想我会继续在复合赋值中使用if/else变量。无论如何谢谢你!通常,我也更喜欢
?:
操作符,但出于某种原因,这个解决方案看起来更优雅,也更可读。这绝对是我喜欢的路线。一个选项是:
opts&=~O\u NONBLOCK;如果(!block)选择|=O|u非block-但这可能不是更好。保持代码可读性比使其复杂化要好得多。这在代码中看起来甚至不像是一个“热路径”,所以我不会担心性能[我并不认为这实际上有什么区别]
if (block)
    opts &= ~O_NONBLOCK;
else
    opts |= O_NONBLOCK;