如何在javascript中对三个变量进行异或运算?

如何在javascript中对三个变量进行异或运算?,javascript,Javascript,与我的相关,您将如何在javascript中对三个布尔变量进行异或运算。一个变量可以为true,其余变量必须为false 这是我的解决方案,但我觉得有一个更好的: function isValid(a, b, c) { return (a !== b ! == c) && [a, b, c].includes(false); } 我从评论中得到了一些反馈,让我来定义一下我的问题(对于所有的困惑,我感到抱歉) 我实际上是在一个typescript类中做这件事的。我想我应该删除

与我的相关,您将如何在javascript中对三个布尔变量进行异或运算。一个变量可以为true,其余变量必须为false

这是我的解决方案,但我觉得有一个更好的:

function isValid(a, b, c) {
  return (a !== b ! == c) && [a, b, c].includes(false);
}
我从评论中得到了一些反馈,让我来定义一下我的问题(对于所有的困惑,我感到抱歉)

  • 我实际上是在一个typescript类中做这件事的。我想我应该删除这个方法,让它成为一个无类函数。我现在意识到这确实会影响解决方案。很抱歉

  • 我想我一定是误用了XOR这个词。我想说的是,只有a、b或c是真的,其中一个必须是真的。我希望这更清楚


  • 我正在研究上一个问题中的类似解决方案。这个可以和你想要的任何数量的布尔人一起使用

    .includes()
    确保数组中存在
    true
    。 通过比较索引和lastIndex,可以知道它是否是唯一的
    true

    这确实假设XOR在所有检查的布尔值中是一个真值。

    constxor=(…booleans)=>(booleans.includes(true)和&booleans.indexOf(true)==booleans.lastIndexOf(true));
    log(xor(…[true,true,true,true]),false);
    log(xor(…[false,false,false,false]),false);
    log(xor(…[true,true,false,false,false]),false);
    
    log(xor(…[false,true,false,false,false]),true)在JavaScript中必须小心,因为看起来像布尔表达式的表达式可能不会返回布尔值。“逻辑”运算符
    &&
    |
    对其左侧和右侧操作数执行布尔解释,但最终值是实际值,与布尔解释之前一样

    如果希望函数将其参数解释为布尔值,并返回一个指示XOR结果的值,那么显式执行此操作可能最简单:

    function isValid(a, b, c) {
      return !!(+!!a ^ +!!b ^ +!!c);
    }
    
    对每个参数执行“to boolean”操作(
    !!
    ),然后执行“to number”(
    +
    )。然后三个数字用
    ^
    进行异或运算,结果转换回布尔值并返回

    “to boolean”操作隐式执行与

    if (something)
    

    是的;也就是说,不管值是什么,都被确定为“truthy”或“falsy”,结果表示为
    true
    false
    。将布尔值转换为一个数字,然后得到0或1。

    如果这些是布尔值,只需过滤并测试只有一个为真:

    function isValid(...args) {
      return args.filter(v => v).length == 1;
    }
    

    如果您的参数保证为布尔值,那么将它们相加并将结果与1进行比较就足够了:

    let hasOneTrue = (...values) => values.reduce((x, y) => x + y) === 1
    
    对于任意值,添加
    Boolean
    typecast(或
    !!
    如果感觉不舒服)

    为了完整起见

    let hasOneFalse = (...values) => values.reduce((x, y) => x + y) === values.length - 1
    
    由于您在编辑中提到了typescript:

    let hasOneTrue = (values: [boolean]): boolean => values.reduce((x, y) => x + (y ? 1 : 0) , 0) === 1
    

    当对3个变量使用XOR时,在2种情况下会得到
    true
    条件 1:当只有一个变量为真时 2:当所有变量都为真时。 只有一个变量为真的条件适用于两个变量。因此,您的查询的解决方案是

    function xor(a,b,c){
      if(a && b && c){
        return false //You have to make an exception for all conditions being true
       }
      return ((a && !b && !c) || (!a && b && !c) || (!a && !b && c) || (a && b && c))
    }
    
    console.log(xor(true,true,true)) //false
    console.log(xor(true,true,false)) //false
    console.log(xor(true,false,false)) //true
    

    类似于
    [a,b,c]。过滤器(x=>!!x)。长度===1
    isValid()
    的确切含义是什么?这里的函数没有任何明显的意义。
    true-XOR-true-XOR-true
    true
    ,而不是
    false
    true-XOR-true
    false
    ,而
    false-XOR-true
    true
    @T.J.Crowder我认为他提到异或只是混淆了一般化。他在文本中解释了他真正想要的东西。@Barmar-我认为这需要澄清,因为无论他真的想要XOR还是真的想要他描述的东西,这都会显著地改变答案。你不需要那些
    ,强制将是隐式的
    !!(a^b^c)
    。但请注意,OP的规则与XORs规则不匹配。@t.J.Crowder这是为了教学清晰:)@t.J.Crowder我也不完全理解OP想要什么。足够公平了。:-)在我意识到XOR与他所描述的不匹配之前,我正打算这样做。这就是XOR。我不清楚他是否真的想要它。他可以……)这是一个很好的解决方案,但是XOR的定义是完全错误的。是的,这就是我想知道的,但是OP要求
    应该有一个真值,并且只有一个。
    。因此,这将解决OPs问题,但它可能不会被称为XOR。@tadman发现,多输入XOR有两种相反的定义。一个是奇数个输入应该为真,另一个是正好1个输入应该为真。更多信息:@IceMetalPunk这是一个有趣的发现,但这也建议使用“奇数奇偶校验”作为该特定操作的术语,而不是广泛理解的布尔算术中的XOR的含义。@tadman It认为它使用“奇数奇偶校验”作为通常的“奇数真”定义的术语,而不是“正好1真”定义。
    true+false==1
    是一种疯狂的JavaScript,不是吗?@tadman:boolean作为数字的子类并不少见,参见python
    function xor(a,b,c){
      if(a && b && c){
        return false //You have to make an exception for all conditions being true
       }
      return ((a && !b && !c) || (!a && b && !c) || (!a && !b && c) || (a && b && c))
    }
    
    console.log(xor(true,true,true)) //false
    console.log(xor(true,true,false)) //false
    console.log(xor(true,false,false)) //true