📌 博客主页 爆打维c
🥛前言
本文将讲到异或操作符的用法,看完这篇文章你会理解到 ^ 的神奇之处
一、异或操作符是什么?
异或操作符 ^ ,用于二进制,两个数对应的二进制位 相同为0,不同为1。
比如:
1的二进制位:00000000 00000000 00000000 00000001
2的二进制位:00000000 00000000 00000000 00000010
1^2的结果为:00000000 00000000 00000000 00000011
最后得到的结果为 3
二、异或操作符的特性
1:X^X=0,X^0=X
即 两个相同的数异或为0,一个数与0异或得到自身
例如:1^1=0, 1^0=1 ,2^0=2
2:符合结合律和交换律
即(A^B)^A=(A^A)^B=0^B=B (是不是跟加法乘法很类似🤣)
三、异或操作符的用法及例题
1.快速比较两个数是否相等
利用上述所说 若a^b==0 则这两数相等
2.不创建中间变量,交换两个数的值
许多同学第一次看到这个题目要求是不是有点懵了,其实很简单
我们只需要用到一个神奇的符号 ^
a = a ^ b;
b = a ^ b; //a ^ b ^ b = a ^ 0 = a;
a = a ^ b; //a ^ b ^ a = 0 ^ b = b;
大家可以用编译器自己尝试编译一下,看看是否交换了数值
3.经典面试题
如果一个数组只有一个数字出现一次,其他数字都出现了两次,我们如何找到这个只出现一次的数字呢?
例如:1,2,3,4,3,2,1 中4只出现一次,如何找出它呢?当然是用 ^ 这个强大的操作符了!
将所有数字依次异或,得到
1^2^3^4^3^2^1=(1^1)^(2^2)^(3^3)^4=0^4=4 是不是4顺利的就找出来了呢
我们再来看一道经典题
题目:
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
编写一个函数找出这两个只出现一次的数字。
例如:
有数组的元素是:1,2,3,4,5,1,2,3,4,6
只有5和6只出现1次,要找出5和6.
我们这时需要分组才能得到这两个数
假设分为以下两组,每一组再异或,还是能找到不一样的数字
详见代码如下:
#include<stdio.h>
//n表示数组长度,num1,num2存储你找到的这两个数据
void Find(int* arr, int n, int* num1, int* num2) {
int i = 0;
int sum = 0;
int k = 0;
//1.将所有数字全部异或,得到剩下两个数异或的结果
for (; i < n; i++) {
sum ^= *(arr + i);
}
//2.找出结果的为1的第k位
for (i = 0; i < 32; i++) {
if (((sum >> i) & 1) ==1) {
k = i;
break;
}
}
//3.遍历数组,将第k位为1的分到一个组,为0的分到一个组
//最终数据存储在*num1 *num2里
for (i = 0; i < n; i++) {
if (((*(arr + i) >> k) & 1 )== 1) {
//第k位为1
*num1^= *(arr + i);
}
else {
//第k位为0
*num2^= *(arr + i);
}
}
}
int main(){
int arr[] = { 1,2,3,4,5,6,1,2,3,4 };
int sz = sizeof(arr) / sizeof(arr[0]);
int n1 = 0, n2 = 0;
Find(arr, sz, &n1, &n2);
printf("%d %d", n1, n2);
return 0;
}
总结
以上就是今天要讲的内容,本文仅仅简单介绍了异或操作符的使用,大家觉得 ^ 用起来是不是特别方便呢?其实它神奇之处远不不止在此,需要大家去慢慢探索它的奥妙,喜欢本篇文章请点个赞支持一下吧!