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

news2024/9/29 16:14:45

今天我们来学习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.coloradmin.cn/o/920278.html

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

相关文章

伴儿行“共享七彩童年”红色教育讲堂篇

迎着徐徐海风&#xff0c;一群青少年缓缓漫步于刘公岛的海岸线&#xff0c;在威海市环翠区伴儿行青少年服务中心老师的带领下&#xff0c;一场沉浸式的红色教育讲堂在百年后的甲午海战战场拉开帷幕。 从甲午海战的前期国际形势讲到当今的国际国内形势&#xff0c;从甲午清朝海军…

SpringCloud学习笔记(六)_Ribbon服务调用

Ribbon介绍 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具 Ribbon是Netflix发布的开源项目&#xff0c;主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时、重试等。简单的说&#xff0c;就是…

【HCIP】15.MPLS基础

多协议标签交换 MPLS位于TCP/IP协议栈中的数据链路层和网络层之间&#xff0c;可以向所有网络层提供服务。 通过在数据链路层和网络层之间增加额外的MPLS头部&#xff0c;基于MPLS头部实现数据快速转发。 术语 MPLS域&#xff08;MPLS Domain&#xff09;&#xff1a;一系列…

EL0读取arm寄存器获取时间的方法

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈思考: 如何在EL0获取当前系统时间?如何在Userspace获取当前系统时间?在EL0可以通过读取ARM寄存器,获取系统的…

Mongodb两种启动方法

一、命令行启动 1.修改存放数据库的位置 说明&#xff1a;E:\data\mongodb&#xff1b;我在E盘创建的文件夹mongodb mongod --dbpathE:\data\mongodb 2.成功启动 说明&#xff1a;默认端口27017&#xff0c;代表已经启动成功 &#xff0c;并在mongodb自动创建文件 二、配置项…

Time-harmonic Maxwell’s equations

参考文献:Preconditioners and their analyses for edge element saddle-point systems arising from time-harmonic Maxwell’s equations

战略是通过分析战领一个位置

战略定位派&#xff1a;战略形成是一个分析过程【安志强趣讲266期】 趣讲大白话&#xff1a;占个有利位置 **************************** 定位通俗讲就是占个有利位置 企业界“心智定位”和“战略定位”吵得很凶 定位这个词最先由特劳特提出&#xff0c;营销要占领消费者的心智…

飞天使-k8s基础组件分析-服务与ingress

文章目录 服务的介绍服务代理服务发现连接集群外服务服务发布无头服务 服务&#xff0c;pod和dns的关系端口转发通过expose 暴露应用服务案例INGRESSMetalLB使用参考文档 服务的介绍 服务的作用是啥&#xff1f; 提供外部调用&#xff0c;保证podip的真实性看看服务解决了什么…

文件上传漏洞-upload靶场1-2关 通过笔记(如何区分前段验证和后端验证)

文件上传漏洞-upload靶场1-2关 通过笔记&#xff08;区分前段验证和后端验证&#xff09; 前言 upload是一个文件上传的专用靶场&#xff0c;搭设也非常简单&#xff0c;只需要把相关源码文件放到apache的网站目录下即可使用&#xff0c;或者去github下载一键绿化包进行安装链…

内网安全:WMI协议与SMB协议横向移动

目录 网络拓扑图 网络环境说明 WMI协议 SMB协议 域内信息收集 WMI协议 - 横向移动 利用方式一&#xff1a;wmic命令 利用方式一&#xff1a;cscript 利用方式一&#xff1a;impacket SMB协议 - 横向移动 利用方式一&#xff1a;psexec 利用方式二&#xff1a;psexe…

外贸客户开发:如何通过谷歌地图找到外贸大客户?

前言&#xff1a;这篇文章分享的实操案例对于外贸从业者特别有用&#xff0c;并分享了一款免费可用的浏览器插件进行如何批量获客。 做外贸需要找客户成交&#xff0c;外贸业务员成单的前提是就是找到国外客户。 外贸找客户的方法无外乎两种&#xff1a; 第一种是主动出击第…

三、pikachu之文件上传

文章目录 1、文件上传概述2、客户端检测2.1 客户端检测原理及绕过方法2.2 实际操作之client check 3、服务端检测3.1 MIME type3.3.1 检测原理3.3.2 绕过方法3.3.3 实际操作之MIME type 3.2 文件内容检测3.2.1 检测原理3.2.2 绕过方式3.2.3 实际操作之getimagesize() 3.3 其他服…

前端学习记录~2023.8.10~JavaScript重难点实例精讲~第6章 Ajax

第 6 章 Ajax 前言6.1 Ajax的基本原理及执行过程6.1.1 XMLHttpRequest对象&#xff08;1&#xff09;XMLHttpRequest对象的函数&#xff08;2&#xff09;XMLHttpRequest对象的属性 6.1.2 XMLHttpRequest对象生命周期&#xff08;1&#xff09;创建XMLHttpRequest对象&#xff…

[C++入门]---vector深度剖析及模拟实现

文章目录 1. vector功能函数模拟实现vector成员变量定义vecor构造函数vector迭代器vector的size函数vector的capacity函数vector的operator[]函数vector的reserve函数vector的resize函数vector的insert函数vector的erase函数vector的push_back函数vector的pop_back函数vector的…

三维重建_体素重建_空间雕刻法/体素着色法

目录 1. 三角化和体素重建的区别 2. 空间雕刻法 空间雕刻法的一致性定义 空间雕刻法具体实现 基于八叉树的空间雕刻法具体实现​编辑 空间雕刻法效果展示 3. 体素着色法 体素着色法的缺点&#xff1a;不唯一性​编辑 体素着色法不唯一性解决措施​编辑 体素着色发实验环境与…

edge浏览器使用jupyter notebook删除快捷键没有用?

按快捷键删除没有用&#xff0c;出现一个黑色方框&#xff0c;里面的数字不断在加 解决方法&#xff1a; 在扩展中将Global Speed控制视频速度的插件关掉&#xff0c;或者将控制速度的快捷键改一下 可以在浏览器设置 》扩展 》管理扩展 里面关掉该插件 可以在Global Speed 的…

安达发APS|三分钟了解智能制造!

智能是由“智慧”和“能力”两个词语构成。从感觉到记忆到思维这一过程&#xff0c;称为“智慧”&#xff0c;智慧的结果产生了行为和语言&#xff0c;将行为和语言的表达过程称为“能力”&#xff0c;两者合称为“智能”。 因此&#xff0c;将感觉、记忆、回忆、思维、语言、…

1631. 最小体力消耗路径

你准备参加一场远足活动。给你一个二维 rows x columns 的地图 heights &#xff0c;其中 heights[row][col] 表示格子 (row, col) 的高度。一开始你在最左上角的格子 (0, 0) &#xff0c;且你希望去最右下角的格子 (rows-1, columns-1) &#xff08;注意下标从 0 开始编号&…

Python+TinyPNG熊猫网站自动化的压缩图片

前言 本篇在讲什么 PythonTinyPNG自动化处理图片 本篇需要什么 对Python语法有简单认知 依赖Python2.7环境 依赖TinyPNG工具 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码内容 ★提高阅读体验★ &#x1f449;…

VMware Workstation Pro 无法使用开机状态下拍的快照来克隆虚拟机,怎么解决?

环境: VMware Workstation Pro16.0 Win10 专业版 问题描述: VMware Workstation Pro有台虚拟机在开机状态下拍了个6.7快照这个win10初始版,现在想在这个快照下直接克隆,无法使用开机状态下拍的快照创建克隆 解决方案: 1.关闭当前虚拟机 2.到虚拟机文件夹复制一份Wind…