C | 妙用异或

举报
CGod 发表于 2022/10/14 17:32:10 2022/10/14
【摘要】 异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0+0=0,1+0=1,0+1=1,1+1=0(相同为0,相异为1),这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法。

在这里插入图片描述
啊我摔倒了..有没有人扶我起来学习....


你好,我是CGod,每个人都可以5分钟编程。
欢迎来到我的主页:《CGod的后花园》


前言

异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0+0=01+0=10+1=11+1=0(==相同为0,相异为1==),这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法。


一、问题的引出

  • 异或本身不是什么难点,但却有它独到的用处。我们先来讨论下述问题要怎么解决
  1. 假如给出两个变量并赋初值,然后我要交换这两个变量的值
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
    int a = 10;
    int b = 20;

    int tmp = a;
    a = b;
    b = tmp;

    printf("a = %d;b = %d", a, b);
    return 0;
}

输出结果:在这里插入图片描述

  1. 很简单嘛~那如果不能定义第三个变量呢?要怎么解决?我们试试看把ab加起来构成一个和
    在这里插入图片描述

对应代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
    int a = 10;
    int b = 20;

    a = a + b;
    b = a - b;
    a = a - b;

    printf("a = %d;b = %d", a, b);
    return 0;
}

输出结果:在这里插入图片描述

  1. 上述是挺巧妙的,但是有一个问题,如果ab都是很大的数,那相加起来就容易超过最大值的限制,那还有什么方法能够既不多定义变量,又能不超过上限,还能交换两变量的值吗?

二、异或实现俩变量值的交换

  1. 我们先来分析分析异或的规律,假如我们在32位操作系统下有两个数3和5
十进制 二进制补码
3 00000000 00000000 00000000 00000011
5 00000000 00000000 00000000 00000101
  1. 我们知道,3 ^ 3 = 05 ^ 5 = 0;所以3 ^ 3 ^ 5 = 55 ^ 3 ^ 5 = 3。应该不难理解吧?(异或满足交换律)
  2. 我们单独拿出分析下这两个式子
表达式 结果
3 ^ 3 ^ 5 5
5 ^ 3 ^ 5 3
  1. 我们可以看出来,有点像转换的感觉
    在这里插入图片描述
    在这里插入图片描述
  2. 于是我们就把35的异或即3 ^ 5当做这个洗衣机。哦不,转换器
    在这里插入图片描述
  3. 用这个方法试试我们一开始的问题
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
    int a = 10;
    int b = 20;

    a = a ^ b;
    b = a ^ b;
    a = a ^ b;

    printf("a = %d;b = %d", a, b);
    return 0;
}

输出结果:在这里插入图片描述

  • 成功啦~实在是妙!接下来需要铁汁们去尝试别的场景了

三、总结

  • 巧妙归巧妙,但是代码的可读性剧烈下降!还是推荐第一种,定义第三个变量进行交换,本文讲这些只是为了让铁汁们多了解一些干货,修炼内功!加油

在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。