两个布尔字段的XOR操作

54

给出两个布尔值,在C#中如何编写最优雅的一行代码来计算异或操作?

我知道可以通过switchifelse的组合来实现,但这会使我的代码变得很丑陋。

4个回答

80
bool xorValue = bool1 ^ bool2;

6
我猜测没有^^运算符是因为短路异或不可能,因为在所有情况下都必须评估两个值。 - Dave Cousineau
5
我个人认为 bool ElegantResult = ElegantBoolean1 ^ ElegantBoolean2; 更加优雅……但我想这真的取决于观察者的眼光。 - Code Jockey
1
它之所以有效,是因为在C#中,true = 1,false = 0。如果您习惯于C/C++和长布尔值,其中有0和非0,那么位或操作会在您的头脑中触发警报。但在C#中不是这种情况。(请注意,转换为布尔值仍然是0和非0,但这不是它们存储的方式。)请参见https://learn.microsoft.com/en-us/dotnet/api/system.boolean?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev15.query%3FappId%3DDev15IDEF1%26l%3DEN-US%26k%3Dk(System.Boolean);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.0);k(DevLang-csharp)%26rd%3Dtrue&view=netframework-4.7.2 - FreeText

75

补充一些上下文信息:

你可以在这里查看表格

在那里,你可以看到“异或”基本上与“不等于”相同。所以你可以使用这个(用布尔值):

if (X != Y)...

但如果你想直接向人们展示你的意思是“XOR”,只需使用这里的其他答案即可。


1
我喜欢这个解决方案。应该上线了。 - Onur Demir
我认为这比使用XOR运算符选项更易读,因为许多开发人员可能不知道XOR运算符并且会误解代码。 - almulo

18

明确地说,^ 是一种位运算 OR,它之所以可以作为逻辑 OR 使用,是因为布尔值的位都是 0(=false)或所有位都是 0 和单个 1 位(=true)。 - FreeText

0

我认为这应该会有所帮助:

A ^ B ? TrueOperation() : FalseOperation();

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