C | 妙用异或

CSDN话题挑战赛第2期
参赛话题:学习笔记


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


目录

  • 前言
  • 一、问题的引出
  • 二、异或实现俩变量值的交换
  • 三、总结


前言

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


一、问题的引出

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

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

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

输出结果:C | 妙用异或_第1张图片

  1. 很简单嘛~那如果不能定义第三个变量呢?要怎么解决?我们试试看把ab加起来构成一个和
    C | 妙用异或_第2张图片

对应代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include
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;
}

输出结果:C | 妙用异或_第3张图片

  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. 我们可以看出来,有点像转换的感觉
    C | 妙用异或_第4张图片
    C | 妙用异或_第5张图片
  2. 于是我们就把35的异或即3 ^ 5当做这个洗衣机。哦不,转换器
    C | 妙用异或_第6张图片
  3. 用这个方法试试我们一开始的问题
#define _CRT_SECURE_NO_WARNINGS 1
#include
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;
}

输出结果:C | 妙用异或_第7张图片

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

三、总结

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

在这里插入图片描述

你可能感兴趣的:(c语言,c++,开发语言,算法,数据结构)