第8天----【位运算进阶之----异或(^)】

今天我们来学习C语言中的异或。

文章目录

  • 一、基本知识:
    • 异或操作满足的定律:(important)
  • 二、拓展应用:
    • 1. 交换两个变量的值:
    • 2. 判断两个数的奇偶性:
    • 3. 检测落单的数(出现奇数次的数):
      • 检测丢失的数:
    • 4. 加密和解密:
  • 三、与离散数学中的异或进行对比:


一、基本知识:

✨在C语言中,异或(XOR)是一种逻辑运算符,用符号^表示。异或操作是将两个操作数的每一位进行比较,如果相同则结果为0,如果不同则结果为1

左操作数右操作数结果
000
011
101
110
  • 例如,假设有两整数变量a和b,其二进制表示分别为:
    a = 1010 , b = 1100
  • 执行a ^ b操作后,得到的结果是:
    a ^ b = 0110

✨总结起来,0和任何数异或还是任何数1和任何数异或则是任何数的取反


异或操作满足的定律:(important)

  1. 结合律:对于任意三个操作数a、b、c,有(a ^ b) ^ c = a ^ (b ^ c)。即异或操作在多个操作数之间满足结合律。

  2. 交换律:对于任意两个操作数a和b,有a ^ b = b ^ a。即异或操作的顺序可以交换

  3. 自反性:对于任意操作数a,有a ^ a = 0。即一个数与自身进行异或操作的结果为0。

  4. 零元素:对于任意操作数a,有a ^ 0 = a。即一个数与0进行异或操作的结果为它本身。

  5. 唯一性:对于任意操作数a,有a ^ a = 0a ^ 0 = a。即一个数与自身进行异或操作的结果为0,与0进行异或操作的结果为它本身。


二、拓展应用:

在这里插入图片描述

1. 交换两个变量的值:

✨可以使用异或操作来交换两个变量的值,而无需使用第三个变量。
例如:

int a = 10;
int b = 20;a = a ^ b;
b = a ^ b;
a = a ^ b;
// 现在a的值为20,b的值为10

❓可能会有人有疑问,为啥右边都是a^b,但最终的结果就可以交换呢?让我们来一步步分析:

  1. 首先,通过a = a ^ b后,a的值将会发生改变,至于变为多少,我们不关心,因为没必要算(实在想算也可以,写出二进制表达后再用定义计算)。
  2. 然后,通过b = a ^ b后,因为a的值已经发生了改变,即此式等价于b = a ^ b ^ b = a ^ 0 = a,从而将a的值赋给了b。
  3. 最后,a = a ^ b = a ^ b ^ a = a ^ a ^ b = 0 ^ b = b。从而实现两个数值的交换。

✨你是否又想到了排序算法中两个值的交换呢?当时我们是通过定义一个临时变量(中间媒介)来完成两个数的交换,类似下面这种方法:

int temp=a;
a=b;
b=temp;

当然,还有很多交换变量值的方法,我们这里就不展开论述了,以后有机会会进行讲解。


2. 判断两个数的奇偶性:

✨可以使用异或操作来判断两个数的奇偶性。如果一个数的二进制表示的最后一位为1,则该数为奇数;如果最后一位为0,则该数为偶数(我们上节已经讲过了)。因此,可以使用异或操作来判断两个数的奇偶性。例如:

int num = 10;
int result=num ^ 1
if (result<num) {printf("num是奇数");
} else {printf("num是偶数");
}

为啥要这样写呢❓

  • 如果一个数为奇数,则其的二进制表示的最后一位为1,和1异或后,最后一位变为0,其余位值不变,所以异或的结果小于原数;(小了1)
  • 反之,若一个数为偶数,则其的二进制表示的最后一位为0,和1异或后,最后一位变为1,其余位值不变,所以异或的结果大于原数;(大了1)

3. 检测落单的数(出现奇数次的数):

✨异或操作可以用来检测数组中是否存在落单的元素。通过对数组中的所有元素进行异或操作,如果结果为0,则表示数组中没有落单的元素;反之则有,且计算结果就是该落单的数。例如:

int arr[] = {1, 2, 1, 3, 4, 3, 2, 1, 1};
int n = sizeof(arr) / sizeof(arr[0]);
int result = 0;for (int i = 0; i < n; i++) {result = result ^ arr[i];
}if (result == 0) {printf("数组中没有落单的元素");
} else {printf("数组中存在落单的元素,输出如下:");printf("%d",result);
}

检测丢失的数:

  • 给定范围[a,b]的一系列数,但是一个调皮的数跑丢了,需要你把它找出来,请问该怎么找?
  • 答:利用今天学习的异或知识就能轻松解决,即把[a,b]所有的数(b-a+1个)和丢失一个数的那些数(b-a个)放在一堆,然后一起异或,重复的数必定两两相消,剩下的一个数就是那个调皮的数。

4. 加密和解密:

✨异或操作可以用来进行简单的加密和解密操作。通过将明文和密钥进行异或操作得到密文,再将密文和密钥进行异或操作得到明文。例如:

char plaintext[] = "Hello World";
char key = 'A';
int n = strlen(plaintext);for (int i = 0; i < n; i++) {plaintext[i] = plaintext[i] ^ key;
}printf("加密后的密文:%s\n", plaintext);for (int i = 0; i < n; i++) {plaintext[i] = plaintext[i] ^ key;
}printf("解密后的明文:%s\n", plaintext);

😄哈哈,是不是很有趣呢?


三、与离散数学中的异或进行对比:

✨离散数学中的异或运算是一种基于布尔代数的运算,也称为逻辑异或运算。它的规则与C语言中的异或运算类似,只不过它的操作对象是逻辑值(真或假)。

  • 在离散数学中,异或运算的结果为真(1)的条件是:有且仅有一个操作数为1。如果两个操作数都为1或都为0,则结果为假(0)。

例如,假设有两个命题p和q,它们的真假分别为(p =1,q = 0) 或(p=0,q=1)。那么p ⊕ q的结果为1,因为有且仅有一个操作数为1。
————————————————

好了,今天的讲解就到这里了,相信你也是收获满满吧!❤️

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/50091.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP/UDP/IP协议简介

IP协议简介 特指为实现一个相互连接的网络系统上从源地址到目的地址传输数据包(互联网数据包) 所提供必要功能的协议 特点&#xff1a; 不可靠&#xff1a;不能保证IP数据包能够成功的到达它的目的地只能提供尽力而为的传输服务。 无连接&#xff1a;IP并不维护任何关于后续数…

vue3中reactive和ref的比较

1.reactive和ref函数的共同作用是什么&#xff1f; 用函数调用的方式生成响应式数据 2. reactive vs ref? 1.reactive不能处理简单类型的数据 2.ref参数类型支持更好但是必须通过.value访问修改 3.ref函数的内部实现依赖于reactive函数 3. 在实际工作中推荐使用哪个? …

rust写一个多线程和协程的例子

当涉及到多线程和协程时&#xff0c;Rust提供了一些非常强大的工具&#xff0c;其中最常用的库之一是tokio&#xff0c;它用于异步编程和协程。下面我将为你展示一个简单的Rust程序&#xff0c;演示如何使用多线程和协程。 首先&#xff0c;你需要在你的项目的Cargo.toml文件中…

Java学习笔记——(22)什么叫表达式、语句

关于这个问题不要觉得不重要&#xff0c;其实大有可以说的地方&#xff0c;这是一个很基础的东西&#xff0c;却有很多人都不是很清楚得了解。 表达式 是由运算符和运算对象组成的,单独的一个运算对象(常量/变量)也可以叫做表达式&#xff0c;这是最简单的表达式. eg.4,42,c…

SLAM-VIO视觉惯性里程计

SLAM 文章目录 SLAM前言IMU与视觉比较单目视觉缺陷&#xff1a;融合IMU优势&#xff1a;相机-IMU标定松耦合紧耦合基于滤波的融合方案&#xff1a;基于优化的融合方案&#xff1a; 前言 VIO&#xff08;visual-inertial odometry&#xff09;即视觉惯性里程计&#xff0c;有时…

java电子病历源码 电子病历编辑器源码 病历在线制作、管理和使用

电子病历在线制作、管理和使用的一体化电子病历解决方案&#xff0c;通过一体化的设计&#xff0c;提供对住院病人的电子病历书写、保存、修改、打印等功能。电子病历系统将临床医护需要的诊疗资料以符合临床思维的方法展示。建立以病人为中心&#xff0c;以临床诊疗信息为主线…

Git企业开发控制理论和实操-从入门到深入(二)|Git的基本操作

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总https://blog.csdn.net/yu_cblog/cate…

3d max插件CG MAGIC中的蜂窝材质功能可提升效率吗?

工作中能提升效率也都是大家所想的&#xff0c;对于设计师的一个设计过程中&#xff0c;可能想怎么样可以更快呀&#xff0c;是哪个步骤慢了呢&#xff1f; 这样的结果只能说会很多&#xff0c;但是建模这个步骤&#xff0c;肯定是有多无少的。 为了让模型更加逼真&#xff0c…

HDLBits-Verilog学习记录 | Verilog Language-Basics(2)

文章目录 9.Declaring wires | wire decl10. 7458 chip 9.Declaring wires | wire decl problem:Implement the following circuit. Create two intermediate wires (named anything you want) to connect the AND and OR gates together. Note that the wire that feeds the …

2023国赛数学建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 最短时…

行业追踪,2023-08-23

自动复盘 2023-08-23 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

uview2.0自定义tabbar

tabbar组件 <template><u-tabbar :value"tab" change"changeTab" :fixed"true" :border"true" :placeholder"true":safeAreaInsetBottom"true"><u-tabbar-item text"消息" icon"c…

缓存的变更(JVM本地缓存->Redis分布式缓存)

在一次需求修改中&#xff0c;下游的服务附加提出了&#xff0c;针对某个业务数据缓存的生效时间的要求 原JVM设计方案&#xff1a; 采用jvm本地缓存机制&#xff0c;定时任务30秒刷新一次 现在redis方案&#xff1a; 因为很多地方使用了这个业务数据缓存&#xff0c;使用方…

Apache Flume架构和原理

Apache Flume是一个开源的分布式、可靠的日志收集和聚合系统,旨在将大量的日志数据从不同的数据源(如应用程序、服务器、设备)收集到中心存储或数据湖中。Flume的架构设计允许用户在大规模数据流的情况下实现可靠的数据传输和处理。 Flume特性 Apache Flume是一个用于收集…

SpringBoot接收参数的8种方式

文章目录 1. 直接把请求参数写在方法的形参中2. 封装一个bean直接来接收3. 原生的HttpServletRequest接收4. PathVariable获取rest风格路径参数5. RequestParam绑定请求参数到方法形参6. RequestBody绑定请求参数到方法形参7. RequestHeader8. CookieValue 1. 直接把请求参数写…

C语言:整型提升

一、什么是整型提升 C语言的整型算术运算至少是以缺省整型类型的精度来进行的。 为了达到这个精度&#xff0c;算术运算表达式中的 字符型char 和 短整型short 需要被转换为普通整型&#xff0c;这种转换成为整型提升。 二、整型提升的意义 表达式的整型运算需要在CPU相应的运算…

华为数通方向HCIP-DataCom H12-821题库(单选题:41-60)

第41题 以下关于IS-IS协议说法错误的是? A、IS-IS协议支持CLNP网络 B、IS-IS 协议支持IP 网络 C、IS-IS 协议的报文直接由数据链路层封装 D、IS-IS协议是运行在AS之间的链路状态协议 答案&#xff1a;D 解析&#xff1a; 关于IS-IS协议的说法错误是D. IS-IS协议是运行在A…

Windows运行Spark所需的Hadoop安装

解压文件 复制bin目录 找到winutils-master文件hadoop对应的bin目录版本 全部复制替换掉hadoop的bin目录文件 复制hadoop.dll文件 将bin目录下的hadoop.dll文件复制到System32目录下 配置环境变量 修改hadoop-env.cmd配置文件 注意jdk装在非C盘则完全没问题&#xff0c;如果装在…

【sql】MongoDB的增删改查分页条件等

【sql】MongoDB的增删改查分页条件等 //增 //新增数据2种方式 db.msg.save({"name":"springboot&#x1f600;"}); db.msg.insert({"name":"mango good"}); db.msg.save({"name":"springboot",type:"工具书&…

线性代数-矩阵的本质

线性代数-矩阵的本质 线性代数-矩阵的本质