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