为什么 Bitwise XOR ( ^ ) 给出的示例结果不同?这是什么逻辑? JS
Why do Bitwise XOR ( ^ ) given example results differ? What is the logic? JS
给出一个由N个整数组成的非空数组A。该数组包含奇数个元素,并且数组的每个元素都可以与另一个具有相同值的元素配对,除了一个未配对的元素。
例如,在数组 A 中:
A[0] = 9 A[1] = 3 A[2] = 9
A[3] = 3 A[4] = 9 A[5] = 7
A[6] = 9
索引 0 和 2 的元素值为 9,
索引 1 和 3 处的元素的值为 3,
索引 4 和 6 处的元素的值为 9,
索引 5 处的元素的值为 7 且未配对。
写一个函数:
function solution(A);
给定一个由满足上述条件的 N 个整数组成的数组 A,returns 是不成对元素的值。
例如,给定数组 A 使得:
A[0] = 9 A[1] = 3 A[2] = 9
A[3] = 3 A[4] = 9 A[5] = 7
A[6] = 9
函数应 return 7,如上例所述。
function different(a) {
let result = 0;
for (let element of a) {
result ^= element
}
return result;
}
const arr = [9, 3, 9, 3, 9, 7, 9];
我发现这个解决方案非常适合所需的条件。我不明白按位异或 ( ^ )
我还测试了不同的数组;
arr = [9, 3, 9, 3, 9, 7, 9]; //returns 7
arr = [9]; //returns 9
arr = [9, 3]; //returns 10
arr = [9, 3, 9, 3]; //returns 0
arr = [9, 3, 9, 9 ]; //returns 10
arr = [9, 3, 9, 2 ]; //returns 2
谁能向我解释一下它是如何工作的?其背后的逻辑是什么?为什么它只在要求的条件下才能完美运行?
此代码有效,因为当您 XOR
一个带有 0
的数字时,您会得到该数字,而当您 XOR
一个带有自身的数字时,您会得到 0
.对于只有一个未配对数字 ([9, 3, 9, 3, 9, 7, 9]
) 的数组的特定条件,您可以将循环展开为
result = 0 ^ 9 ^ 3 ^ 9 ^ 3 ^ 9 ^ 7 ^ 9
自从
a ^ b = b ^ a
这可以改写为
result = 0 ^ 9 ^ 9 ^ 3 ^ 3 ^ 7 ^ 9 ^ 9
= 0 ^ 0 ^ 0 ^ 7 ^ 0
= 7
当存在多个不匹配值时,此方法不起作用的原因是您最终得到的结果是所有不匹配值的 XOR
。例如,对于 [9, 3, 9, 9]
你得到
result = 9 ^ 3 ^ 9 ^ 9
= 9 ^ 3 ^ 0
= 10
在回答主要问题之前,您应该了解 XOR 的工作原理。对于偶数个相同的位,xor 的位为 0,对于奇数个位,xor 的位为 1。 XOR 的真值table-
异或
0 0 0
0 1 1
1 0 1
1 1 0
现在开始你的推理:
假设你想异或,注意中间状态是二进制表示
2^2 = 10 ^ 10 = 00 = 0(以 10 为基数)
2^2^3 = 10^10^11 = 11 = 3(以 10 为基数)
1^2^3 = 01^10^11 = 00 = 0(以 10 为基数)
注意到错误的结果了吗?我希望现在您知道 XOR 是如何工作的。所以只有当数字在数组中配对时它才会起作用,并且只会正确地找出一个未配对的数字。
给出一个由N个整数组成的非空数组A。该数组包含奇数个元素,并且数组的每个元素都可以与另一个具有相同值的元素配对,除了一个未配对的元素。
例如,在数组 A 中:
A[0] = 9 A[1] = 3 A[2] = 9
A[3] = 3 A[4] = 9 A[5] = 7
A[6] = 9
索引 0 和 2 的元素值为 9, 索引 1 和 3 处的元素的值为 3, 索引 4 和 6 处的元素的值为 9, 索引 5 处的元素的值为 7 且未配对。 写一个函数:
function solution(A);
给定一个由满足上述条件的 N 个整数组成的数组 A,returns 是不成对元素的值。
例如,给定数组 A 使得:
A[0] = 9 A[1] = 3 A[2] = 9
A[3] = 3 A[4] = 9 A[5] = 7
A[6] = 9
函数应 return 7,如上例所述。
function different(a) {
let result = 0;
for (let element of a) {
result ^= element
}
return result;
}
const arr = [9, 3, 9, 3, 9, 7, 9];
我发现这个解决方案非常适合所需的条件。我不明白按位异或 ( ^ )
我还测试了不同的数组;
arr = [9, 3, 9, 3, 9, 7, 9]; //returns 7
arr = [9]; //returns 9
arr = [9, 3]; //returns 10
arr = [9, 3, 9, 3]; //returns 0
arr = [9, 3, 9, 9 ]; //returns 10
arr = [9, 3, 9, 2 ]; //returns 2
谁能向我解释一下它是如何工作的?其背后的逻辑是什么?为什么它只在要求的条件下才能完美运行?
此代码有效,因为当您 XOR
一个带有 0
的数字时,您会得到该数字,而当您 XOR
一个带有自身的数字时,您会得到 0
.对于只有一个未配对数字 ([9, 3, 9, 3, 9, 7, 9]
) 的数组的特定条件,您可以将循环展开为
result = 0 ^ 9 ^ 3 ^ 9 ^ 3 ^ 9 ^ 7 ^ 9
自从
a ^ b = b ^ a
这可以改写为
result = 0 ^ 9 ^ 9 ^ 3 ^ 3 ^ 7 ^ 9 ^ 9
= 0 ^ 0 ^ 0 ^ 7 ^ 0
= 7
当存在多个不匹配值时,此方法不起作用的原因是您最终得到的结果是所有不匹配值的 XOR
。例如,对于 [9, 3, 9, 9]
你得到
result = 9 ^ 3 ^ 9 ^ 9
= 9 ^ 3 ^ 0
= 10
在回答主要问题之前,您应该了解 XOR 的工作原理。对于偶数个相同的位,xor 的位为 0,对于奇数个位,xor 的位为 1。 XOR 的真值table- 异或 0 0 0 0 1 1 1 0 1 1 1 0
现在开始你的推理:
假设你想异或,注意中间状态是二进制表示
2^2 = 10 ^ 10 = 00 = 0(以 10 为基数)
2^2^3 = 10^10^11 = 11 = 3(以 10 为基数)
1^2^3 = 01^10^11 = 00 = 0(以 10 为基数)
注意到错误的结果了吗?我希望现在您知道 XOR 是如何工作的。所以只有当数字在数组中配对时它才会起作用,并且只会正确地找出一个未配对的数字。