Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 数组整数操作数的位异或运算_C_Arrays_Xor - Fatal编程技术网

C 数组整数操作数的位异或运算

C 数组整数操作数的位异或运算,c,arrays,xor,C,Arrays,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 a

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

对于数组,按位异或的逻辑是如何工作的

例如,在下面的代码中:-

// 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;
}
//函数返回唯一出现的奇数元素
int findOdd(int arr[],int n){
int res=0,i;
对于(i=0;i
整个findOdd函数究竟是如何工作的?
有人能解释一下在上面的代码示例中使用xor背后的基本逻辑吗?

在数组上使用
xor
与正常的
xor
按位xor
没有什么不同。为了更好地理解逻辑,以下是
xor
的属性

  • 相同位的异或返回0
  • 不同位的异或返回1
现在,数组只包含一个出现奇数次的元素。因此,当对两个相同的数字应用
xor
时,结果是
0
xor
0
,任何数字都给出了数字本身

因此,当我们
xor
数组中的所有元素时,偶数出现通过返回
0
来抵消,最终结果仍然是唯一奇数出现的元素


HTH.

在阵列上使用
xor
与正常的
xor
按位异或
没有什么不同。为了更好地理解逻辑,以下是
xor
的属性

  • 相同位的异或返回0
  • 不同位的异或返回1
现在,数组只包含一个出现奇数次的元素。因此,当对两个相同的数字应用
xor
时,结果是
0
xor
0
,任何数字都给出了数字本身

因此,当我们
xor
数组中的所有元素时,偶数出现通过返回
0
来抵消,最终结果仍然是唯一奇数出现的元素


HTH.

您使用了
按位异或
,因此它处理二进制字节。它不是直接应用于数组,而是应用于数组中存储的数据的二进制表示

函数的作用是查找数组中出现奇数的数

以及使用
XOR
操作的属性-

任何数字的异或本身都会给我们提供
0

任何带有
0
的数字的
XOR
都会给我们数字本身

我们可以理解每个迭代中的操作-

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
操作的属性-

任何数字的异或本身都会给我们提供
0

任何带有
0
的数字的
XOR
都会给我们数字本身

我们可以理解每个迭代中的操作-

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
作为结果

什么时候在数组中使用按位异或


它对位执行操作,而不是对整个数组执行操作。它的使用方式与我们对两个数字使用它的方式类似。

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

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

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

  • 可交换的(即A或B与B或A相同)
  • 结合的(即A xor(B xor C)与(A xor B)xor C相同)
  • 按位异或只是对操作数的每一位并行执行异或运算。给定这两个属性,我们可以在不改变结果的情况下按任意顺序对数组元素进行异或运算

    现在,考虑2个数的按位异或。始终为0:

    A^A == 0
    
    对于每一个均匀出现的数字,我们可以将它们配对,这些配对的按位异或为0

    因此,数组的按位异或是数组中奇怪出现的元素的按位异或

    如果只有一个元素出现奇数次,findOdd将返回该数字

    但是,请注意,如果有多组奇怪出现的数字,该函数将不会执行您可能期望的操作


    例如,取
    {5,2,2,7}
    的异或,2的相消,但剩下的是
    5^7=0b101^0b111=0b010=2

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

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

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

  • 可交换的(即A或B与B或A相同)
  • 结合的(即A xor(B xor C)与(A xor B)xor C相同)
  • 按位异或只是对操作数的每一位并行执行异或运算。给定这两个属性,我们可以在不改变结果的情况下按任意顺序对数组元素进行异或运算

    现在,考虑2个数的按位异或。始终为0:

    A^A == 0
    
    对于每一个均匀出现的数字,我们可以将它们配对,这些配对的按位异或为0

    因此,数组的按位异或是数组中奇怪出现的元素的按位异或

    如果只有一个元素出现奇数次,findOdd将返回该数字

    但是,请注意,如果