C语言 | 异或运算符的妙用

按位异或 ( ^ ) , 可以在不额外创建变量的情况下,对两个整形变量的数值进行交换。

 

原理

在二进制中,对应的对应二进制位相同时异或为零,相异时异或为一。

运算过程如下图,

 

应用 (一):整形数值交换

我们可以利用异或 ( ^ ) 对两个整形变量进行数值交换。

具体实现过程如下:

#include <stdio.h>
int main(void) {

    int a = 10;
    int b = 13;
    b = a^b;
    a = b^a;
    b = b^a;
    printf("%d %d",a,b);
}

对这段代码进行运行,输出的结果为:

 

应用(二):寻找消失的数字

如果光靠这一个交换整形变量的应用的话,不好理解其妙处所在。那么这个应用二,则可以帮助更好地理解异或 ( ^ ) 运算符的妙用所在。

题目:

现有数组nums,它存储了从0到n的整数(不重复),但是nums丢失了一位整数,如何利用异或 ( ^ ) 运算符来需找出它?

int missingNumber(int* nums, int size)

{
    int ret = 0;
    for (int i = 0; i < size; i ++)    //对nums内每个元素进行异或存储
    {
        ret ^= nums[i];
    }
    for (int i = 0; i <= size; i++)    //查找出丢失的数
    {
        ret ^= i;
    }
    return ret;    //此时变量ret的值为消失的那个数
}

 如果光看代码,不好看懂其妙用。

我的理解是,异或 ( ^ ) 就是一张信用卡 

我定义个整形变量 ret,假设变量n = 10 我将0 ~ n内的所有数都异或一遍,就是ret = ^= nums[i],此时变量ret内记录了 0 ~10 内的所有数

完事后,我还钱,将ret 与 0 ~ 10 都与 变量ret 异或 ( ^ ) 一遍来抵消,得出来最后的值为0,

那么,我只抵消0 ~ 9 呢?不抵消10,那么异或 ( ^ ) 后得出来的结果是10。

为了更好的理解,建议动手在草稿纸上算一遍,n可以取值为3、4,减少计算量 。

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

福楠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值