xor有3个值我需要在3个值之间做一个异或条件,即我需要三个值之一为真但不超过一个而不是没有。我以为我可以使用xor^运算符,但它没有按预期工作。我希望这会返回false,但事实并非如此。(true^true^true)所有其他组合似乎都按我的预期工作。在查看xor运算符的文档时,他们只谈论比较2个值,而我在网上找不到3个或更多值的任何内容。任何人都可以阐明或建议一种简单的方法吗?((true^true)^true)将返回true,这不是您所期望的true^true^true。为确保获得所需的结果(只有一个值为真),请执行以下操作:if((a&&!b&&!c)||(!a&&b&&!c)||(!a&&!b&&c))或者,根据@jcomeau_ictx的回答,您可以执行以下操作:if(Convert.ToInt32(a)+Convert.ToInt32(b)+Convert.ToInt32(c)==1)或者,您可以创建一个function:publicboolTernaryXor(boola,boolb,boolc){//return((a&&!b&&!c)||(!a&&b&&!c)||(!a&&!b&&c));//考虑到JimMischel的评论,一个更快的解决方案是:return(!a&&(b^c))||(a&&!(b||c));编辑:您可能想命名FunctionTernaryXor以更清楚地了解函数的结果。一种方法是将布尔值转换为整数,将结果相加,然后与1进行比较。由于我无法充分了解Linq,如何:new[]{a,b,c}.Count(v=>v)==1这很短!(a&&b&&c)&&(a^b^c)当然,这是一个棘手的问题。给定你想要的:abcrslt00000011010101101001101011001110这样做:rslt=(!a&(b^c))||(a&!(b|c));第一部分处理a为0的四种情况。第二部分处理a不为0的情况。一种更简单的查看方式:rslt=(a|b|c)&!((a&b)|(a&c)|(b&c))即三者必须有一个为真,但不能有两个(或更多)为真。似乎应该有一种方法可以进一步简化它,但没有想到。也许我需要更多咖啡因。编辑我认为这是我今天早上正在寻找的解决方案:rslt=a?!(b|c):(b^c);现在,至于我为什么使用|而不是||:这是一个风格问题,是分支的旧偏见(旧习惯很难改掉)的结合。!(b|c)生成此IL代码:ldarg.1ldarg.2或ldc.i4.0ceqstloc.0此代码中没有分支。如果我使用||,如!(b||c),它会生成:ldarg.1brfalse.sIL_009Bldarg.2br.sIL_009CIL_009B:ldc.i4.1IL_009C:stloc.0有两个分支。我不知道JIT生成的代码是否会反映这一点,但我怀疑它会。因此,一位代码是始终执行的6条指令。另一种是6条指令,有时只执行4条。但是,如果不执行两条指令,分支惩罚可能会吃掉任何收益。我意识到现代CPU在分支方面比8086好得多,并且两个代码片段的运行时间可能没有任何可检测到的差异。即使有,也不太可能对我通常编写的程序的整体运行时间产生重大影响。但是我告诉你,它当然习惯了!在分支非常昂贵的8086上,(b|c)和(b||c)之间的差异是巨大的。最后,使用|正如您指出的那样强制评估整个表达式。我的原始代码实际上是“如果此表达式为真或表达式为真”。使用&&和||把它变成一堆条件,在我看来,这些条件更难阅读。所以:基于性能考虑的旧偏见很可能已经过时了。但无害。但是,必须注意不要写(b()|c())除非必须评估两个函数。解决方案很简单a=true;b=假;c=真(a^b)||(a^c)使用XOR,如果(false^false^false)应该返回false。研究如何使用XOR来工作。如果只有一个元素为真,则返回真。如果它们都是假的,它将返回假。如果你想用3个值来表示,比如a、b和c,表达式应该是:(aorborc)and~(aandb)and~(aandc)and~(bandC)Here是更合适的格式:(avbvc)*~(a*b)*~(a*c)*~(b*c)XOR是二元运算符,不能对两个以上的操作数进行运算。根据操作顺序,当您看到:(false^false^false)时,您真正得到的是`((false^false)^false)。考虑到这一点,在评估这是否适合您的过程中,为您自己的操作构建一个真值表可能会有用。在上面列出的示例中,您会看到:(Op1XOROp2)XOROp3=ResultFFFFFFTTFTFTFTTFTFFTTFTFTTFFTTTT这使得XOR在所有操作数都为真且可能需要一些特殊处理的情况下出现问题,例如通过添加AND而不是(Op1ANDOp2和Op3)。XOR是二元运算符,一次只能用于2个值。因此,当您执行(trueXORtrueXORtrue)时,它实际上是((trueXORtrue)XORtrue)...在内部(trueXORtrue)解析为false,因为它们是相同的。解析后,余数为(假XOR真),解析为真。听起来你在匹配条件时试图变得聪明或超级高效。这可能需要几分钟来理清,然后编写真值表或测试以确保它正确处理所有可能的组合。只计算其中有多少是真的和if(countTrues==1)就简单多了。这样做的原因是它没有显着的开销,与仅使用位旋转的解决方案相比,它实际上是可读和可理解的(这里有几个其他答案证明了这一点)。遇到这种情况我走错了路,试图解决我自己的问题(4个值的异或);决定LINQ是处理N-case问题的最简单方法;boolOneAndOnlyOneIsTrue(IEnumerableconditions){返回条件.Count(c=>c)==1;}像这样打电话;boolOneLuckyGuy(Personp1,Personp2,Personp3,Personp4){returnOneAndOnlyOneIsTrue(new[]{p1.IsAMan(),p2.IsAMan(),p3.IsAMan(),p4.IsAMan()});}在指令方面,这将检查每个条件一次,所以函数是O(n),但它是灵活的,该死的网站比按位替换更具可读性。?以上就是C#学习教程的全部内容:xor有3个值。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处:
