第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,一经查实,立即删除!

相关文章

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…

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;如果装在…

python中的matplotlib画折线图(数据分析与可视化)

先导包&#xff08;必须安装了numpy 、pandas 和matplotlib才能导包&#xff09;&#xff1a; import numpy as np import pandas as pd import matplotlib.pyplot as plt核心代码&#xff1a; import numpy as np import pandas as pd import matplotlib.pyplot as pltpd.se…

机器学习-使用 XGBoost 时间序列预测能源消耗

简而言之&#xff0c;时间序列预测是根据以前的历史数据预测未来值的过程。目前使用时间序列预测的最热门领域之一是加密货币市场&#xff0c;人们希望预测比特币或以太坊等流行加密货币的价格在未来几天甚至更长时间内将如何波动。另一个现实世界的案例是能源消耗预测。尤其是…

智能井盖传感器,物联网智能井盖系统

随着城市人口的不断增加和城市化进程的不断推进&#xff0c;城市基础设施的安全和可靠性变得愈发重要&#xff0c;城市窨井盖作为城市基础设施重要组成部分之一&#xff0c;其安全性事关城市安全有序运行和居民生产生活安全保障。 近年来&#xff0c;各地都在加强城市窨井盖治理…

【2023新教程】树莓派定时自动拍照并上传腾讯云对象存储COS

1 换源 仅适用于Release date: May 3rd 2023、Debian version: 11 (bullseye)这个树莓派OS版本&#xff0c;其他版本不保证有效。 首先使用如下命令&#xff0c;查看自己树莓派的架构。 uname -a结果如下&#xff1a; 如果红圈处显示为aarch64&#xff0c;使用命令sudo na…

【TypeScript】声明文件

在 TypeScript 中&#xff0c;声明文件&#xff08;Declaration Files&#xff09;用于描述已有 JavaScript 代码库的类型信息&#xff0c;以便在 TypeScript 项目中使用这些代码库时获得类型支持。 当你在 TypeScript 项目中引用外部 JavaScript 模块或库时&#xff0c;可能会…

设计模式之组合模式(Composite)的C++实现

1、组合模式的提出 在软件开发过程中&#xff0c;使用者Client过多依赖所操作对象内部的实现结构&#xff0c;如果对象内部的实现结构频繁发生变化&#xff0c;则使用者的代码结构将要频繁地修改&#xff0c;不利于代码地维护和扩展性&#xff1b;组合模式可以解决此类问题。组…

【IDEA配置创建类注释模板和方法模板教程】

IDEA配置创建类注释模板和方法模板教程 废话不多说直接上干货 废话不多说直接上干货 先看效果: 类: 方法: IDEA类注释模板 &#xff0c;配置步骤&#xff1b; 直接用模板: /*** description: ${description}* author: Lynn.OuYang* create: ${YEAR}-${MONTH}-${DAY} ${HOU…

期权分仓开户资金是否安全?具体保障措施有哪些?

网上关于期权分仓系统的真假一直都没有定论&#xff0c;两方人的争论也让很多没有接触过期权分仓系统的人摸不着头脑&#xff0c;那么期权分仓靠谱吗&#xff1f;资金在里面安全吗&#xff1f;下文为大家科普期权分仓开户资金是否安全?具体保障措施有哪些&#xff1f; 一、期权…