当前位置: 首页 > news >正文

C | 妙用异或

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


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


目录

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


前言

异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用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
十进制二进制补码
300000000 00000000 00000000 00000011
500000000 00000000 00000000 00000101
  1. 我们知道,3 ^ 3 = 05 ^ 5 = 0;所以3 ^ 3 ^ 5 = 55 ^ 3 ^ 5 = 3。应该不难理解吧?(异或满足交换律)
  2. 我们单独拿出分析下这两个式子
表达式结果
3 ^ 3 ^ 55
5 ^ 3 ^ 53
  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;
}

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

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

三、总结

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

在这里插入图片描述

相关文章:

  • 采用uni-app开发的多端圈子社区论坛系统
  • Java语言特点
  • 读书笔记1|深度学习入门:Machine Learning Yearning
  • matplotlib+cartopy+geopandas,实现专业地图可视化
  • 【网络安全篇】php伪协议-漏洞及其原理
  • 【操作系统】实时调度
  • 【python】之序列及其基本操作
  • 温湿度传感器实验-传感器原理及应用实验
  • 2022 年值得推荐的 Vue 库
  • 2022年大二学生HTML期末作业,网页制作作业(我的校园网站制作)
  • 数据库SQL面试题
  • STM32——内存管理实验
  • Kubernetes技术与架构-14
  • 浅谈软件编程中的8大数据结构
  • 【模型训练】YOLOv7电塔绝缘子检测
  • SegmentFault for Android 3.0 发布
  • [译] 怎样写一个基础的编译器
  • 【mysql】环境安装、服务启动、密码设置
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • const let
  • Facebook AccountKit 接入的坑点
  • GitUp, 你不可错过的秀外慧中的git工具
  • iOS 颜色设置看我就够了
  • Linux中的硬链接与软链接
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • python docx文档转html页面
  • Selenium实战教程系列(二)---元素定位
  • tab.js分享及浏览器兼容性问题汇总
  • vue-router 实现分析
  • 仿天猫超市收藏抛物线动画工具库
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 手机端车牌号码键盘的vue组件
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 异常机制详解
  • 找一份好的前端工作,起点很重要
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • $.ajax()参数及用法
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (day6) 319. 灯泡开关
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (SpringBoot)第七章:SpringBoot日志文件
  • (ZT)薛涌:谈贫说富
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (六)激光线扫描-三维重建
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • .Net core 6.0 升8.0
  • .net MySql
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .net程序集学习心得