根据另一个布尔值取反一个布尔值

21

如何用简洁、优雅、位运算的方式编写这段 C# 代码的最后一行,而不需要两次使用 b

bool getAsIs = ....
bool b = ....

getAsIs ? b : !b

我在想你为什么要这样做?只是因为写了两次 b 吗?性能?我不认为这些都是深刻的原因。 - nemo
为了简洁性/可读性和可能的性能,因为在我的情况下到达“b”实际上涉及解除三个属性引用。 - HappyNomad
1
我非常确定虚拟机/编译器会以任何方式优化它(包括取消引用和指令),但被证明是错误的会很有趣。位操作对可读性肯定没有帮助:D - nemo
1
我怀疑虚拟机/编译器的解引用会影响运行时行为,但被证明是错误的也很有趣。消除重复代码肯定有助于提高可读性。 - HappyNomad
3个回答

47

真值表可以表示为:

getAsIs    b    getAsIs ? b : !b
--------------------------------
0          0    1
0          1    0
1          0    0
1          1    1

结果可以表达为:

result = (getAsIs == b);

实际上,我可以用这个答案的术语来重新表述我的问题。也就是说,我可以将“getAsIs”重命名为“targetValue”。 - HappyNomad
PlusOne - 正是我所寻找的! - Simon Bosley

9

尝试使用二进制异或 (^ 运算符 (C# 参考)):

bool getAsIs = true;
bool b = false;

bool result = !(getAsIs ^ b);

4

我认为这是

var foo = !(getAsIs ^ b)

简短、优雅,但肯定会让人思考!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接