(c语言)理解异或操作符

本文详细介绍了异或操作符的定义、特性,如X^X=0和满足结合律,以及如何利用异或进行快速比较、交换数值和解决经典面试题。通过代码示例展示了如何在编程中运用异或操作。
摘要由CSDN通过智能技术生成

📌 博客主页   爆打维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;
}


总结

以上就是今天要讲的内容,本文仅仅简单介绍了异或操作符的使用,大家觉得 ^ 用起来是不是特别方便呢?其实它神奇之处远不不止在此,需要大家去慢慢探索它的奥妙,喜欢本篇文章请点个赞支持一下吧!

  • 20
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值