我只是一个初学者。所以,我面临的问题是: -
在数组的情况下,按位XOR的逻辑如何工作?
例如,在下面的代码中: -
// Function to return the only odd occurring element
int findOdd(int arr[], int n) {
int res = 0, i;
for (i = 0; i < n; i++)
res ^= arr[i];
return res;
}
int main(void) {
int arr[] = {12, 12, 14, 90, 14, 14, 14};
int n = sizeof(arr)/sizeof(arr[0]);
printf ("The odd occurring element is %d ", findOdd(arr, n));
return 0;
}
究竟,整个findOdd函数是如何工作的? 有人可以在上面的代码示例中解释使用xor背后的基本逻辑吗?
答案 0 :(得分:2)
您使用过bitwise XOR
,因此它会处理二进制字节。它不是直接应用于数组,而是存储在其中的数据的二进制表示。
用什么函数来查找数组中出现奇数的数字。
使用XOR
操作的属性 -
XOR
都会给我们0
,
<{1}} XOR
的任何数字0
都会给我们编号。
我们可以理解每次迭代中的操作 -
1 iteration- res=0(0000)^12(1100) -> res= 12(1100) // just writing in decimal for clarity
2 iteration- res=12(1100)^12(1100) -> res=0(0000) //operation is done on its binary representation
3 iteration- res=0^14 -> res=14
4 iteration- res=14 (00001110) ^ 90 (01011010) -> res=84 (01010100)
5 iteration- res=84^14-> res=90
6 iteration- res=90^14 -> res=84
7 iteration- res=84^14-> res=90
因此,res
返回90
作为结果。
我们什么时候在数组中使用按位XOR?
它对位执行操作,而不是对整个数组执行操作。它的使用方式与我们在两个数字上使用的方式类似。
答案 1 :(得分:1)
xor
在数组上的工作与普通xor
或bitwise xor
没有区别。为了更好地理解逻辑,以下是xor
的属性。
xor
返回0 xor
返回1 现在,该数组只包含一个奇数次出现的元素。因此,当xor
应用于两个相同的数字时,结果为0
和xor
0
,任何数字都会给出数字本身。
因此,当我们xor
数组中的所有元素时,即使出现也会通过返回0
而取消,最终结果仍然是唯一奇怪的元素。
HTH。
答案 2 :(得分:1)
findOdd函数使用^或按位xor运算符。
您已经了解过算术运算符,如+,或 - 等等。
xor运算符与加法和乘法有一些共同点properties。它是:
按位xor只是对操作数的每个位并行执行xor运算。给定这两个属性,我们可以按任何顺序对数组元素进行xor而不改变结果。
现在,考虑2个数字的按位xor。它总是0:
A^A == 0
对于每个均匀出现的数字,我们可以将它们配对,并且这些对的按位xor为0。
因此,数组的按位xor是数组奇数元素的按位xor。
如果只有一个元素出现奇数次,则findOdd将返回此数字。
但是,请注意,如果存在多组奇怪的数字,则该功能将无法达到预期效果。
EG。取{5, 2, 2, 7}
的xor,2的取消,但我们留下,5^7 = 0b101 ^ 0b111 = 0b010 = 2
。