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将返回该数字
但是,请注意,如果