我不明白这个异或发生了什么
I don't understand what is happening with this XOR
我正在处理这个问题。
“给定一个数组,找到出现奇数次的整数。
永远只有一个整数出现奇数次。”
我在网上想出了这个解决方案:
function findOdd(A) {
var n = 0;
for(var i = 0; i < A.length; i++){
n = n^A[i];
}
return n;
}
这行得通,但我不确定为什么,我希望有人能向我解释一下。我只是不明白这行:
n = n^A[i];
你能告诉我在这种情况下它在做什么吗?
任何一个数与其自身异或都会得到0。如果知道只有一个数出现奇数次,其他数就会自异相抵消,答案就是剩下的那个数出现奇数次。
^ 是一个 exor 位运算符。所以当你这样做时
1^1 为 0
0^1 是 1
- 1^0 是 1
- 0^0 是 0
所以要找到 1 的奇数,下面的代码所做的是
最初结果是 arr[0] 是 1 。
所以在数组中 0^0 变为 0 并且 2^2 变为 0 并且有 3 个 1's 所以 1^1 变为 0 而对于 0^1 我们遗漏了重复奇数次的数字
var arr=[1,1,1,0,0,2,2];
var result=arr[0];
for(var i=1;i<arr.length;i++)
result=result ^ arr[i];
console.log(result);
希望对您有所帮助
两个相同数字的异或总是零。也就是说,
A^A=0
因此,如果您将一个特定数字与自身重复异或偶数次,结果将为零。
这里,最初n的值为零。将进行偶数次 XOR 运算的数字的结果为零。出现奇数次的数字,比如 2m+1
次,出现 2m 次时结果为零,最后一次出现时结果为相同的数字。
这就是这个解决方案的工作原理。
按位运算符处理 32 位数字。操作中的任何数字操作数都转换为 32 位数字。结果被转换回 JavaScript 数字。 ^
是按位异或 javascript 运算符。
按位 XOR 运算符 returns 每个位位置的一个 1,其中一个操作数的对应位(但不是两个操作数的对应位都是 1)。
如果 a 和 b 不同,则 a XOR b 产生 1。异或运算的真值table是:
a b a XOR b
0 0 0
0 1 1
1 0 1
1 1 0
表达式的解释 n = n^A[i];
让A = [1,2,3,4,5]
for n=0, i=0
=> 0 ^ A[0]
=> 0 ^ 1
=> 转换为二进制 0000 ^ 0001
结果为 0001
等于 1
for n=1, i=1
=> 1 ^ A[1]
=> 1 ^ 1
=> 转换为二进制 1111 ^ 0010
结果为 1101
等于 13
等等...希望这个解决方案可以帮助您理解上面的表达式并消除所有疑虑。
我正在处理这个问题。 “给定一个数组,找到出现奇数次的整数。 永远只有一个整数出现奇数次。” 我在网上想出了这个解决方案:
function findOdd(A) {
var n = 0;
for(var i = 0; i < A.length; i++){
n = n^A[i];
}
return n;
}
这行得通,但我不确定为什么,我希望有人能向我解释一下。我只是不明白这行:
n = n^A[i];
你能告诉我在这种情况下它在做什么吗?
任何一个数与其自身异或都会得到0。如果知道只有一个数出现奇数次,其他数就会自异相抵消,答案就是剩下的那个数出现奇数次。
^ 是一个 exor 位运算符。所以当你这样做时
1^1 为 0
0^1 是 1
- 1^0 是 1
- 0^0 是 0
所以要找到 1 的奇数,下面的代码所做的是 最初结果是 arr[0] 是 1 。 所以在数组中 0^0 变为 0 并且 2^2 变为 0 并且有 3 个 1's 所以 1^1 变为 0 而对于 0^1 我们遗漏了重复奇数次的数字
var arr=[1,1,1,0,0,2,2];
var result=arr[0];
for(var i=1;i<arr.length;i++)
result=result ^ arr[i];
console.log(result);
希望对您有所帮助
两个相同数字的异或总是零。也就是说,
A^A=0
因此,如果您将一个特定数字与自身重复异或偶数次,结果将为零。
这里,最初n的值为零。将进行偶数次 XOR 运算的数字的结果为零。出现奇数次的数字,比如 2m+1
次,出现 2m 次时结果为零,最后一次出现时结果为相同的数字。
这就是这个解决方案的工作原理。
按位运算符处理 32 位数字。操作中的任何数字操作数都转换为 32 位数字。结果被转换回 JavaScript 数字。 ^
是按位异或 javascript 运算符。
按位 XOR 运算符 returns 每个位位置的一个 1,其中一个操作数的对应位(但不是两个操作数的对应位都是 1)。
如果 a 和 b 不同,则 a XOR b 产生 1。异或运算的真值table是:
a b a XOR b
0 0 0
0 1 1
1 0 1
1 1 0
表达式的解释 n = n^A[i];
让A = [1,2,3,4,5]
for n=0, i=0
=> 0 ^ A[0]
=> 0 ^ 1
=> 转换为二进制 0000 ^ 0001
结果为 0001
等于 1
for n=1, i=1
=> 1 ^ A[1]
=> 1 ^ 1
=> 转换为二进制 1111 ^ 0010
结果为 1101
等于 13
等等...希望这个解决方案可以帮助您理解上面的表达式并消除所有疑虑。