C语言异或操作详解(小小异或,大大作用~)

article/2025/11/6 5:47:56

文章目录

    • *按位异或"^"
    • (1)何为“^”:
      • ①“^”的介绍
    • (2)用于算法的经典案例:
      • 1.数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?(源自leetcode面试题 17.04. 消失的数字)
      • 2.一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。(源自leetcode.剑指 Offer 56 - I. 数组中数字出现的次数)
        • ①思路:
        • ②解题代码:
      • 3.在不开辟新空间的前提之下,交换两个变量的值,例如,再不开辟新空间的前提下,a=3,b=4,交换a,b的值。
        • ①思路:运用规律二即可。
        • ②解题代码:
    • (4)总结一番!:
        • ①异或运算的规律:

*按位异或"^"

(1)何为“^”:

①“^”的介绍

* “ ^ ”的异或指的是二进制中,对应的对应二进制位相同时异或为零,相异时异或为一
让1^2,它的结果是什么呢?
二进制形式下,异或的过程就是:在这里插入图片描述左为异或前的1 、2右为异或结果。

规律一:这里我们也可看出,大小相同的数字异或结果一定为0,而0与任何数字进行异或大小不会改变。********************比如3 ^ 3=0, 3 ^ 0=3.(可以动笔试试2333)
规律二:自反性:其实就是用规律一推出A^B^B=A,那它本质上就是大小相同的数字异或结果为0

(2)用于算法的经典案例:

现在我们知道了二进制的异或原理,那么我们可以用它来解决什么问题呢?别急,这就放上几个经典例题:

1.数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?(源自leetcode面试题 17.04. 消失的数字)

题意为,给你一个0~n的不重复的无序整形数组,找到其中缺少的数字

举个栗子~ 给数组nums=[3,1,0] 要你通过算法输出[2] ;

好,现在我们就用异或的简单原理来解决这个问题:
首先,我们先来找找这个异或有无规律可循,
那么我们就在草稿本上奋笔疾书一番:

发现1^2=3——1^2^3=0——1^2^3^4=4——1^2^3^4^5=1——1^2^3^4^5^6=7——1^2^3^4^5^6^7=0——1^2^3^4^5^6^7^8=8——1^2^3^4^5^6^7^8^9=1。看到这里,相信你们一定有个想法是吧!,没错,笔者奋笔疾书,发现了个寂寞!!!
但是!!!咱还是有其它灵感的,就是这些二进制运算是否能和加乘法一样符合结合律和交换律呢?
答案是肯定的,以[0,1,2,3,4]为例,1^2^3^4=4,而3^2^1^0=4(不信可以在纸上试试呢!)好的,这样我们又发现第二条规律。
规律三:二进制的异或运算符合结合律和交换律

做了这么多前戏,终于可以开始解题了(泪目)……
由规律二可知0~n它的异或结果是个定值,且它们的异或不分先后顺序,那我们就把0 ~ n的所有数字全部异或一遍先,再和题目给定数组nums中的数字进行异或,我们从规律一知道,相同数字异或会等于0,由此便可获得缺少的那个数字,用图表示它的原理大概就是这样:

解题代码:在这里插入图片描述
让我们一鼓作气,再来个进阶训练:

2.一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。(源自leetcode.剑指 Offer 56 - I. 数组中数字出现的次数)

题意明确,就是让我们从给定的一堆整形数组中找出只出现一次的两个数字。

①思路:

假设只出现一次的数字为x , y
(1)让给定数组nums每个元素依次异或(由规律二、三中的自反性和无序性知,出现两次的数字最终都被异或为0,最终的异或结果为两个只出现一次的数字的异或结果)
(2)找到分离x,y的区别点(在(1)中我们已经获得这两个只出现一次的数字的异或结果,然后我们就要想办法分离出他们。我们知道,如果在一组数组中,只出现一次的数字只有一个的时候,让数组内的元素自己异或,由于异或的自反性,它最终的异或结果就是那个只出现一次的数字,所以我们先找到它们的区别点

在这里插入图片描述

可看到,二进制异或结果为1时,x,y的二进制形式在该位一定不同,分别为0,1(不同异或才为1嘛~)那么我们可将原数组中的元素分为两派,第一派是其二进制形式指定位处为1的数字;第二派则是其二进制形式指定位处为0的数字.指定位可任意找,我则是由地位向高位找,具体看代码即可知道)
(3)由二我们可获的两派,分别让这两派的数字自行异或,即可获得x,y。

②解题代码:

#include<stdio.h>
#include<stdlib.h>
int* singleNumbers(int* nums, int numsSize, int* returnSize) {int ret = 0;//只出现一次的两个数的异或结果int x = 0;//出现一次的数int y = 0;//出现一次的数int j = 0;for (int i = 0; i < numsSize; i++){ret = ret ^ nums[i];//出现两次的数字异或为零,只剩下出现一次数字异或后的结果}for (; j < 32; j++){if (ret & (1 << j))//找到出现一次数组的分离位j(可将原数组分为两组:第j位为0的为一组;第j为为1的为一组)break;}for (int k = 0; k < numsSize; k++){if (nums[k] & (1 << j)){x = x ^ nums[k];//出现两次的数异或为0,只剩x}else{y = y ^ nums[k];//出现两次的数异或为0,只剩y}}int* arr = (int*)malloc(sizeof(int) * 2);arr[0] = x;arr[1] = y;*returnSize = 2;return arr;
}

相信你做完上面两道例题后,对异或的性质已经有熟练掌握了,那么下面这道例题你能否独立完成呢?

3.在不开辟新空间的前提之下,交换两个变量的值,例如,再不开辟新空间的前提下,a=3,b=4,交换a,b的值。

①思路:运用规律二即可。

②解题代码:

int main()
{int a = 3;int b = 4;a = a ^ b;b = b ^ a;//由自反性质和交换律可得b==b^a^b==aa = a ^ b;//a==a^b^a==b;return 0;
}

(4)总结一番!:

①异或运算的规律:

规律一:这里我们也可看出,大小相同的数字异或结果一定为0,而0与任何数字进行异或大小不会改变。********************比如3 ^ 3=0, 3 ^ 0=3.(可以动笔试试2333)
规律二:自反性:其实就是用规律一推出A^B^B=A,那它本质上就是大小相同的数字异或结果为0
规律三:二进制的异或运算符合结合律和交换律*************************************************

http://chatgpt.dhexx.cn/article/EqgBw90V.shtml

相关文章

【c语言操作符系列1】^(异或操作符)讲解和多种例题详解

目录 一、^ 是什么&#xff08;^称为异或&#xff09; 二、^的规律(特点) 三、可利用^秒杀的常见例题&#xff08;重点&#xff09; 1、消失的数字 2、不一样的人生密码 3、交换两个数&#xff08;不能创建中间变量&#xff09; 4、找出只出现一个的两个数字 一、^ 是什么…

C语言中位运算异或“∧”的作用

前言&#xff1a; 为了方便查看博客&#xff0c;特意申请了一个公众号&#xff0c;附上二维码&#xff0c;有兴趣的朋友可以关注&#xff0c;和我一起讨论学习&#xff0c;一起享受技术&#xff0c;一起成长。 1.概念 异或运算符"∧"也称XOR运算符。它的规则是若参…

此公众号并没有这些scope的权限,错误码:10005

有时候在使用微信公众号时会出错&#xff0c;被告知没有权限&#xff0c;如下图所示&#xff1a; 出现这问题有以下原因&#xff1a; 订阅号没有相关的权限账号没有认证&#xff0c;没有相关的权限scope 参数位置错误 解决方案&#xff1a; 需要在OAuth2.0网页授权中配置授权…

Discuz 论坛 手机端微信登录报错:此公众号并没有这些scope的权限,错误码:10005

抛出问题 当discuz绑定微信公众号时&#xff0c;可以控制微信公众号的一些操作&#xff1a; 解决问题 而出现这种错误的原因一般由三种&#xff1a; 订阅号没有相关的权限账号没有认证&#xff0c;没有相关的权限scope 参数位置错误 排查问题&#xff1a; Discuz的微信…

10005---2017年国内开源项目Top50

国内开源项目&#xff0c;不错&#xff0c;大力支持&#xff0c;顶&#xff01;&#xff01;&#xff01; 我要是有钱&#xff0c;一定出资赞助他们啊。 2017 年度码云热门项目排行榜 TOP 50 出炉啦&#xff01;我们根据所有开源项目在码云的用户关注度、活跃度、访问量等信息…

Gurobi--Error code: 10005. Unable to retrieve attribute solved ‘Pi‘ 解决

Gurobi code 问题代码&#xff1a; 本来想获取变量的对偶空间&#xff0c; double[] dualmodel.get(GRB.DoubleAttr.Pi,model.getConstrs());但是报错&#xff0c;Error code: 10005. Unable to retrieve attribute ‘Pi’ 原因是在gurobi中&#xff0c;二进制变量&#xf…

此公众号并没有这些scope的权限 错误码10005

问题背景 看到好多原先可以的公众号忽然提示&#xff0c;“此公众号并没有这些scope的权限 错误码10005”。其实我也没真正解决。但是翻了论坛&#xff0c;为大家带来以下提示 解决方案

记录一次微信登录失败此公众号并没有这些 scope的权限,错误码:10005

在2023年4月17日&#xff0c;大概早上9:45分微信公众号出现 微信登录失败 此公众号并没有这些 scope的权限&#xff0c;错误码:10005 如下图&#xff1a; 经过网上查阅以及咨询微信开发的人&#xff0c;最终确认出是微信问题。刚开始其他公众号商家还没反馈到微信这个问题&…

Mysql出现问题:ERROR 1005 (HY000): Can‘t create table 解决方案

回城传送–》《数据库问题解决方案》 ❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作者🏆,阿里云专家博主🏆,51CTO专家博主🏆 ❤️技术活,该赏 ❤️点赞 👍 收藏 ⭐再看,养成…

微信授权登录10005解决方案汇总

微信授权登录10005解决方案汇总 微信官方登录能力文档说明: https://developers.weixin.qq.com/community/develop/doc/000c840489c6380d63389dbb451402 微信授权登录报错10005的主要原因: 该图片文章来源: https://blog.csdn.net/qq_39702981/article/details/82703171 其次…

使用readelf分析一个elf文件完整结构

编译器编译源代码后生成的文件叫目标文件&#xff1b; 从结构上来说与可执行文件一致&#xff0c;只是还没有经过动态链接的过程&#xff0c;有符号还没有被调整。与真正可执行文件稍有区别。 可执行文件格式涵盖了程序的编译、链接、装载和执行的各个方面。 windows下的PE和…

GCC详解-Binutils工具之readelf

1、介绍 readelf从ELF 格式的目标文件显示信息。 readelf和objdump提供的功能类似&#xff0c;但是它显示的信息更为具体&#xff0c;并且它不依赖BFD库(BFD库是一个GNU项目&#xff0c;它的目标就是希望通过一种统一的接口来处理不同的目标文件) 2、ELF格式的文件 ELF&…

readelf命令使用

0x1、概述 readelf命令&#xff0c;一般用于查看ELF格式的文件信息&#xff0c;常见的文件如在Linux上的可执行文件&#xff0c;动态库(*.so)或者静态库(*.a) 等包含ELF格式的文件。以下命令的使用是基于android编译出来的so文件上面去运行。 0x2、readelf常用命令 语法&#x…

readelf的使用

记录下有接触到的使用。 这个命令可以用来查询可执行文件依赖什么动态库&#xff0c;查看静态库中包含了什么.o文件。 1、查询可执行文件依赖什么动态库 2、静态库中包含了什么.o文件

linux readelf,Linux readelf命令使用

readelf用来显示ELF格式目标文件的信息.可通过参数选项来控制显示哪些特定信息。 (注意: readelf不支持显示archive文档, 也不支持64位的ELF文件)。 使用方法1&#xff1a; 查看共享库的依赖库(NEEDED)和搜索名(SONAME)。 readelf -d 例如&#xff1a; #readelf -d libuClibc-…

Linux命令:readelf

1 需求 关键参数&#xff1a; -h/--file-header Display the ELF file header-l/--program-headers/--segments Display the program headers-S/--section-headers/--sections Display the sections header-s/--syms/--symbols Display the symbol table--dyn-sys…

readelf命令使用说明

0x1、概述 readelf命令&#xff0c;一般用于查看ELF格式的文件信息&#xff0c;常见的文件如在Linux上的可执行文件&#xff0c;动态库(*.so)或者静态库(*.a) 等包含ELF格式的文件。以下命令的使用是基于android编译出来的so文件上面去运行。 0x2、readelf常用命令 语法&…

readelf指令使用

一、指令说明 readelf命令&#xff0c;一般用于查看ELF格式的文件信息&#xff0c;常见的文件如在Linux上的可执行文件&#xff0c;动态库(*.so)或者静态库(*.a) 等包含ELF格式的文件。以下命令的使用是基于android编译出来的so文件上面去运行。 readelf常用命令 语法&#xff…

Mysql开发实践:error while loading shared libraries: libaio解决方案

摘要&#xff1a;Mysql出现问题&#xff1a;error while loading shared libraries: libaio解决方案。 本文分享自华为云社区《Mysql出现问题&#xff1a;error while loading shared libraries: libaio解决方案》&#xff0c;作者&#xff1a; 小虚竹。 问题 初始化数据库时…