在数组的int操作数上使用按位XOR

时间:2015-10-03 07:03:07

标签: c arrays xor

我只是一个初学者。所以,我面临的问题是: -

在数组的情况下,按位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背后的基本逻辑吗?

3 个答案:

答案 0 :(得分:2)

您使用过bitwise XOR,因此它会处理二进制字节。它不是直接应用于数组,而是存储在其中的数据的二进制表示。

用什么函数来查找数组中出现奇数的数字

使用XOR操作的属性 -

任何数字的{p> 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在数组上的工作与普通xorbitwise xor没有区别。为了更好地理解逻辑,以下是xor的属性。

    相同位的
  • xor返回0
  • 不同位的
  • xor返回1

现在,该数组只包含一个奇数次出现的元素。因此,当xor应用于两个相同的数字时,结果为0xor 0,任何数字都会给出数字本身。

因此,当我们xor数组中的所有元素时,即使出现也会通过返回0而取消,最终结果仍然是唯一奇怪的元素。

HTH。

答案 2 :(得分:1)

findOdd函数使用^或按位xor运算符。

您已经了解过算术运算符,如+,或 - 等等。

xor运算符与加法和乘法有一些共同点properties。它是:

  1. 可交换(即A x或B与B x或A相同)
  2. 关联(即A xor(B xor C)与(A xor B)xor C)相同。
  3. 按位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