异或(^)的性质与应用

异或运算的性质: 异或 异或运算的性质: 1. 交换律:A ^ B = B ^ A; 2. 结合律:A ^ (B ^ C) = (A ^ B) ^ C; 3. 恒等律:X ^ 0 = X; 4. 归零律:X ^ X = 0; 5. 自反:A ^ B ^ B = A ^ 0 = A; 6. 对于任意的 X: X ^ (-1) = ~X; 7. 如果 A ^ B = C 成立,那么 A ^ B = C,B ^ C = A; 8.∀i∈Z\forall i \in Z∀i∈Z,有 4i ^ (4i+1) ^ (4i+2) ^ (4 阅读详情
AI摘要

本文深入解析异或运算的基本概念,包括符号、运算规则及性质,并详细阐述其在变量交换、排除偶次重复及解决LeetCode难题中的应用。通过实例演示,使读者能够掌握异或运算的技巧。

本文目录

1 基本概念

2 异或应用

3 相关文章


1 基本概念

1.1 符号

异或是一种二进制的位运算,符号以 XOR 或 ^ 表示。

1.2 运算规则

相同为0,不同为1,即

1 ^ 1 = 0

0 ^ 0 = 0

1 ^ 0 = 1

由运算规则可知,任何二进制数与零异或,都会等于其本身,即 A ^ 0 = A。

1.3 异或性质

(1)交换律: A ^ B = B ^ A

(2)结合律: ( A ^ B ) ^ C = A ^ ( B ^ C )

(3)自反性: A ^ B ^ B = A (由结合律可推: A ^ B ^ B = A ^ ( B ^ B ) = A ^ 0 = A)

2 异或应用

2.1 变量交换

示例:将 a 和 b 两个变量值交换,例如: a = 3,b = 7,交换后,a = 7,b = 3。

// 常规方法
int temp = a;  // temp = 3
a = b;         // a = 7
b = temp;      // b = 3

// 异或方法
a = a ^ b;  // a = 3 ^ 7
b = a ^ b;  // b = (3 ^ 7) ^ 7 = 3 ^ (7 ^ 7) = 3
a = a ^ b;  // a = (3 ^ 7) ^ (3 ^ 7 ^ 7) = (3 ^ 3) ^ (7 ^ 7) ^ 7 = 7

2.2 排除偶次重复

示例:在一个整数数组中,仅存在一个不重复的数字,其余数字均出现两次(或偶数次),找出不重复数字。

// 常规方法:通过二次循环找出不重复的数字
for (...) {
    for (...) {
        ...
    }
}

// 异或方法:将所有整数异或,出现偶数次的整数会被抵消,最终留下不重复整数。
int result = 0;
for (int index = 0; index < numArray.length; index++) {
    result = result ^ numArray[index];
}
return result;

2.3 排除偶次重复变种

示例:将数字1-999存放在一个大小为1000的数组中,其中只有一个数字重复出现两次,找出重复数字。

/* 异或方法:该问题为异或自反性的变种题,将数字以二进制形式展示,即可发现其中奥秘。
 *          1:    0    0    0    0    0    0    0    0    0    1
 *          2:    0    0    0    0    0    0    0    0    1    0
 *          3:    0    0    0    0    0    0    0    0    1    1
 *          4:    0    0    0    0    0    0    0    1    0    0
 *          5:    0    0    0    0    0    0    0    1    0    1
 *          6:    0    0    0    0    0    0    0    1    1    0
 *          7:    0    0    0    0    0    0    0    1    1    1
 *          8:    0    0    0    0    0    0    1    0    0    0
 *          9:    0    0    0    0    0    0    1    0    0    1
 *         10:    0    0    0    0    0    0    1    0    1    0
 *         11:    0    0    0    0    0    0    1    0    1    1
 *         12:    0    0    0    0    0    0    1    1    0    0
 *         13:    0    0    0    0    0    0    1    1    0    1
 *         14:    0    0    0    0    0    0    1    1    1    0
 *         15:    0    0    0    0    0    0    1    1    1    1
 *         16:    0    0    0    0    0    1    0    0    0    0
 *        ....
 *        999:    1    1    1    1    1    0    0    1    1    1
 *   PreCount:  511  255  127   63   31   15    7    3    1    0
 * RepeatSpan: 1024  512  256  128   64   32   16    8    4    2
 *  MaxRepeat:    0    1    3    7   15   30   62  124  249  499
 *       Flag:    A    B    C    D    E    F    G    H    I    J
 * 
 * 每一位(列)的前置0个数PreCount:2的n-1次方减1
 * 每一位(列)的完整重复跨度为RepeatSpan:2的n次方
 * 每一位(列)的完整重复次数为MaxRepeat:(999 - PreCount) / Repeat 向下取整
 * 每一位(列)的非完整重复内的数字个数:999 - MaxRepeat * Repeat - PreCount
 *
 * 每一个完整重复内,前一半为1,后一半为0;
 * 末位(J位)完整重复内,异或结果为1;
 * 非末位(J位)完整重复内,均为偶数个1,异或结果为0;
 *
 * 由此可知:计算每一位(列)非完整重复部分的异或结果 与 完整重复部分的异或结果,即可得最终结果。
 * J位:非完整重复数字个数   1,完整重复 499个1, 整体偶数个1,最终结果0;
 * I位:非完整重复数字个数   2,完整重复 249个0, 整体偶数个1,最终结果0;
 * H位:非完整重复数字个数   4,完整重复 124个0, 整体偶数个1,最终结果0;
 * G位:非完整重复数字个数   0,完整重复  62个0, 整体偶数个1,最终结果0;
 * F位:非完整重复数字个数  24,完整重复  30个0, 整体偶数个1,最终结果0;
 * E位:非完整重复数字个数   8,完整重复  15个0, 整体偶数个1,最终结果0;
 * D位:非完整重复数字个数  40,完整重复   7个0, 整体偶数个1,最终结果0;
 * C位:非完整重复数字个数 104,完整重复   3个0, 整体偶数个1,最终结果0;
 * B位:非完整重复数字个数 232,完整重复   1个0, 整体偶数个1,最终结果0;
 * A位:非完整重复数字个数 488,完整重复   0个0, 整体偶数个1,最终结果0;
 * 
 * 即:1-999数字的异或结果为0
 *
 * 因此,将1000个整数依次异或运算,最终结果就是重复的数字,相当于重复数字与0进行异或,得到其本身。
 */
int result = 0;
for (int index = 0; index < numArray.length; index++) {
    result = result ^ numArray[index];
}
return result;

2.4 LeetCode 260:只出现一次的数字Ⅲ

题目:给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。

思路:

(1) 先通过一次异或操作,重复元素会被抵消,最终结果相当于两个单次出现的元素(分别记为one和two)的异或值;

(2) 由异或规则可知,若两个元素one和two的异或值的某二进制位为1,则表示两个元素在该二进制位上的值不同,即分别为1和0,找到其中一个满足条件(为1)的二进制位(记为bitValue);

(3) 根据(2)找到的二进制位bitValue,可以将原数组分成两个部分,one 和 two 分别在两个部分,而相同的重复元素也会被分到同一个部分(因为其相应的二进制位的值是相同的);

(4) 对于两个部分再次进行异或操作,即相当于 排除偶次重复 问题,最终可以得到两个题解。

class Solution {

  public int[] singleNumber(int[] nums) {

    // 通过异或操作,最终结果等于两个单次出现的元素的异或值。
    int filterResult = 0;
    for (int num : nums) {
      filterResult ^= num;
    }

    // 计算首个为1(从右侧开始)的二进制位的值
    int bitValue = filterResult & (filterResult - 1) ^ filterResult;

    // 以首个为1的二进制位将原数组分为两个部分并分别进行异或运算,最终结果为两个题解。
    int oneResult = 0, twoResult = 0;
    for (int num : nums) {
      if ((num & bitValue) > 0) {
        oneResult ^= num;
      } else {
        twoResult ^= num;
      }
    }

    return new int[]{oneResult, twoResult};
  }
}

3 相关文章

《全排列(Java)》

《位运算:减法与补码》

《图解:常用排序算法(冒泡、选择、插入、希尔、快速、归并、堆)》

《回溯算法(试探算法)》

《动态规划:鸡蛋掉落》

《动态规划:单词拆分》

《状态机:只出现一次的数字II》

《最小堆:TopK问题》

《链表:快慢指针》

【位运算进阶之----异或(^)】 因此,可以使用异或操作来判断两个数的奇偶性。通过对数组中的所有元素进行异或操作,如果结果为0,则表示数组中没有落单的元素;例如,假设有两个命题p和q,它们的真假分别为(p =1,q = 0) 或(p=0,q=1)。通过将明文和密钥进行异或操作得到密文,再将密文和密钥进行异或操作得到明文。当然,还有很多交换变量值的方法,我们这里就不展开论述了,以后有机会会进行讲解。即一个数与自身进行异或操作的结果为0,与0进行异或操作的结果为它本身。✨可以使用异或操作来交换两个变量的值,而无需使用第三个变量。 阅读详情

相关推荐

DIY电子管耳放实战:12AU7+6V6GT组合的电路设计与调试心得

本文详细分享了DIY电子管耳放的实战经验,重点解析了12AU7与6V6GT经典组合的电路设计、元件选型与调试过程。内容涵盖从核心架构设计、关键元件(如输出变压器、耦合电容)的科学选型,到静态工作点设置、负反馈引入及常见噪声问题的排查,旨在帮助音响DIY爱好者和电子管放大器初学者成功打造一台低失真、高信噪比且富有“胆味”的耳机放大器,享受动手制作的乐趣与温暖音质。

weixin_29230805的博客 554

什么是异或_异或运算及异或运算的作用

什么是异或_异或运算及异或运算的作用 异或,是一个数学运算符,英文为exclusive OR,缩写为xor,应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为:   a⊕b = (¬a ∧ b) ∨ (a ∧¬b)   如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。   异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下...

cxu123321的博客 26万+

算法之动态规划(DP)求解完全背包问题

算法之动态规划(DP)求解01背包问题 上面这篇文章主要讲解了01背包问题和动态规划算法,如果你不了解动态规划算法,建议先浏览一下这篇文章熟悉一下,因为,本文的算法思想是基于这篇文章的。 1、什么是完全背包问题? **01背包问题:**有一个背包的容积为V,有N个物品,每个物品的体积为v[i],权重为w[i],每个物品只能取1次放入背包中,背包所有物品权重和最大是多少? 完全背包: 有一个背包的容积为V,有N个物品,每个物品的体积为v[i],权重为w[i],每个物品可以取无限次放入背包中,背包所有物品权重和

PRML_MAN的博客 2万+

异或的妙用

同或、异或总是记不住?异或有啥用?

weixin_46879314的博客 3万+

高分思路!挑战7天完成一篇网状meta DAY1-7

PASSION!继续析挑战,7天完成一篇网状meta分!

MR_SCI_help的博客 787

学习笔记【Day 20】鸿蒙PC应用在SD WAN MSTP场景用CodeArts test工具测试过程

多生成树协议(MSTP)作为二层网络高可靠、无环路的核心技术,其在鸿蒙 PC 上的兼容性与稳定性测试尤为重要。本文结合华为云 CodeArts TestPlan 全流程测试管理平台,详细拆解鸿蒙 PC 端 MSTP 功能的测试设计、环境搭建、执行验证。1.测试左移,保障迭代效率CodeArts TestPlan 将 MSTP 测试从后期集成阶段 “左移” 至开发早期,通过可复用用例库与自动化脚本,支持每次代码提交后的快速回归测试,避免网络功能稳定性因迭代被破坏。2.平台化工具破解复杂场景测试难题。

aiyijianghe的博客 1058

史上最通俗易懂的异或运算详解【含例题及应用】

一. 什么是异或? 1. Wikipedia的解释: 在逻辑学中,逻辑算符异或(exclusive or)是对两个运算元的一种逻辑析取类型,符号为 XOR 或 EOR 或 ⊕(编程语言中常用^)。但与一般的逻辑或不同,异或算符的值为真仅当两个运算元中恰有一个的值为真,而另外一个的值为非真。转化为命题,就是:“两者的值不同。”或“有且仅有一个为真。” 2. 定义 1 ⊕ 1 = 0 0 ⊕ 0 = 0 1 ⊕ 0 = 1 0 ⊕ 1 = 1 3. 真值表 Y B = 0 B = 1

weixin_43899069的博客 14万+

GEE:计算非水体概率影像(水体淹没次数)

本文记录了在GEE平台上使用哨兵数据计算沿海地区非水体概率图像的计算方法和代码。基于像素,概率范围0-100。首先使用哨兵数据(s2)和大津算法(OTSU)计算的水体指数阈值来提取水体,然后计算研究区非水体像素在时间段内出现的概率。

养乐多的博客 2141

知识整理——异或

今晚,要初步学会异或运算。 1、概念:(相同为0,不同为1,可以和物理中的非门一起理解) 异或,英文为exclusive OR,缩写成xor,异或(xor)是一个数学运算符。它应用于逻辑运算。 数学符号:”“⊕”,计算机符号为“xor”。 运算法则:a⊕b = (¬a ∧ b) ∨ (a ∧¬b) 文字解释:如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。 异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0

weixin_45883286的博客 8664

28、基准剂量法:原理、应用与计算详解

本文详细介绍了基准剂量法(BMD)的原理、在监管机构中的应用以及具体的计算方法。内容涵盖样本量与BMD的关系、主要监管机构如EPA对BMD的应用、BMD的模型选择与数据拟合过程、拟合优度评估、下置信限(BMDL)计算,以及实验设计对BMD结果的影响。同时,还讨论了剂量指标和响应选择的关键问题,为理解和应用基准剂量法提供了全面的参考。

info6的博客 280

手写中间件之——并行框架(1 并行框架的应用场景和需求)

我们为什么会需要一个带任务顺序编排的并行框架 1 复杂的微服务系统间调用 经常会有这样的调用场景:app(或web前端)调用后台的一个接口,该接口接到该请求后,需要调用其他多个微服务来获取数据,最终汇总一个最终结果返回给用户。 譬如用户请求“我的订单”,后台在收到请求后,就需要去调用用户详情rpc、商品详情rpc、库存rpc、优惠券rpc等等很多个服务。有些服务是可以并行去请求的,但有些服务...

tianyaleixiaowu的专栏 1万+

与&,或|,异或^简单的性质和应用

你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。

Genyun的博客 179

CARLA仿真:自定义地图与AI车辆行为编程

CARLA仿真:自定义地图与AI车辆行为编程 ,人工智能,计算机视觉,大模型,AI,本文围绕CARLA仿真平台,介绍了其基础功能与安装方法,详解地图系统,包括预设地图的加载切换及自定义地图的创建、导入与优化。还阐述了AI车辆的创建、属性设置、销毁,以及行为控制,如交通规则遵守、路径规划、复杂行为编程和行为树应用。同时涉及传感器与车辆感知、交通场景构建、自定义地图与AI行为结合应用、高级应用,以及常见问题解决方案和学习资源,为CARLA仿真应用提供全面指导。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 11万+

`算法知识` 二进制操作, 与&, 或|, 异或^

1

WChang的博客 292

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

异或的逆元

布尔环与整数运算有很多相同的属性。例如,整数运算的一个属性是每个值x都有一个加法逆元-x,使得x+(-x)=0.布尔环也有类似的属性,这里的“加法”运算是ˆ,不过这时每个元素的加法逆元是它自己本身。也就是说,对于任何值a来说,a^a=0,这里我们用0来表示全0的位向量。 因此有(a^b)a=b。 例如,不使用第三个变量达到交换两个变量的值的目的。 代码如下 // An highlighted bl...

zero_only的博客 2275

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

异或^操作符(C语言)

一、 简介 1. 异或^操作符:是一个位操作符,针对于二进制位(比特位)的操作。 2. 规则:两个数在同一个二进制位(比特位),相同为0;不同为1。 3. 异或操作符的一些性质: 3.1 任何一个数与自己异或都等于0: a^a=0; 3.2 任何一个数与0进行异或操作等于它自己: a^0=a; 3.3 异或运算满足交换律,结合律 : a^b=b^a; (a^b)^c=a^(b^c); 二、示例 示例1: 题目要求:交换两个int变量的值,不能使用第三个变量,如a=3,b=5,交换后a=5,b=3; 代

weixin_61253613的博客 6759

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

按位异或在数值交换中的应用

异或运算符(^)   参加运算的两个数据,按二进制位进行“异或”运算。 运算规则:0^0=0;  0^1=1;  1^0=1;   1^1=0;    即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。   “异或运算”的特殊作用: (1)使特定位翻转找一个数,对应X要翻转的各位,该数的对应位为1,其余位为零,此数与X对应位异或即可。 例:X=10...

zhuweijianZWJ的博客 962

C语言异或运算在程序设计中的妙用

异或运算符^也称XOR运算符。它的规则是若参加运算的两个二进位同号,则结果为0(假);异号则为1(真)。即0 ^ 0=0,0 ^ 1=1,1 ^ 1=0。 性质: (1)一个数与1异或会翻转 (2)一个数与0异或保持不变 (3) 一个数异或它本身等于0 (4) 每一位的结果只与该位有关。 应用: (1) 使特定位翻转 假设有01110101,现在想让第...

afafa1314的博客 393

位运算(<<移位>>、与&、或|、反~、异或^)及运用【求子集】【判相等】...(各类问题持续更新)

位运算概念、技巧及综合应用实用总结;各类问题持续更新,有相关问题可以评论区留言让我更新~

vagatable_XX的博客 2065

与(&)、非(~)、或(|)、异或(^)、>>右移、<<左移

5.右移(>>):右移运算在编程中用>>表示,a>>b表示将把a的二进制,整体往右边移动b的单位,得到一个新的二进制,并且自动高位补0,就是相当于除以2^b;6.左移(<<):左移运算在编程中用<<表示,a<<b表示将把a的二进制,整体往左边移动b的单位,得到一个新的二进制,并且自动低位补0,就是相当于乘以2^b;3.或(|):或运算在编程中用|表示,它的运算规则是:有一为一,全零为零。2.非(~):非运算在编程中用~表示,它的运算规则是:零变一,一变零。(a>>b)&1操作:右移后的结果与。

2301_80402575的博客 615

位操作符详解:异或、与、或的原理与算法竞赛实战技巧

位运算是计算机底层与算法设计中的基础能力,直接映射到CPU的算术逻辑单元,因此具备极高的执行效率。与、或、异或三种操作符看似简单,却蕴含着状态压缩、掩码操作、加密校验等丰富的工程实践价值。其中异或的自反性与归零律,更是能在数组去重、区间异或和、交换变量等场景中实现算法复杂度的质变。理解位运算,不仅有助于掌握底层硬件的工作机制,也是攻克算法竞赛、嵌入式开发、网络协议解析等领域的必备技能。本文从二进制逻辑的本质出发,系统梳理位操作符的真值表、核心性质与常见陷阱,并结合CSP-J等真实赛题,演示前缀异或、按位统计

weixin_34211761的博客 327

异或运算交换变量值

这段代码展示了使用异或运算实现变量交换的技巧。通过宏定义swap(x,y)利用异或运算的逆运算性质:x^y^y=x,实现了不借助临时变量的高效交换。文中详细分析了异或运算的6个核心性质(交换律、逆运算、结合律等),并通过二进制示例演示了交换过程:首先x记录差异值(x^y),然后y还原为原x值(y^d),最后x还原为原y值(x^d)。这种方法的优势在于节省内存且执行速度快,但可读性较差,适用于对性能要求高的场景。

u014765054的专栏 221

计算机中位运算的一些性质与技巧

目录 一、位运算总共有5总运算: 二、每种运算都有相应的性质: 三、位运算基础上扩展的一些解法 在实际中,由于计算机采用的是二进制存储,所以关于位运算的操作能够实现并简化很多复杂问题。 一、位运算总共有5总运算: 与(&)、或(|)、异或(^)、左移(<<)、右移(>>)。 二、每种运算都有相应的性质: 1.与:都真才真。任何数与0相与都为0,任何数与1相与都为其本身; 2.或:都假才假。任何数与0相或都为其本身,任何数与1相或都为1; 3.异或:任何数与

qq_41687938的博客 1630

C语言异或操作符:从核心原理到算法优化的实战指南

位运算作为计算机底层基础操作,通过直接操作二进制位实现高效数据处理。异或运算遵循“相同为0,不同为1”的二进制规则,具备交换律、结合律、自反性等数学特性,使其成为无进位加法和可控翻转的理想实现。在技术价值上,异或运算能以O(1)时间复杂度完成位翻转、数据校验和状态切换,在空间复杂度优化方面表现突出。实际应用场景涵盖算法优化(如找出数组中出现奇数次的元素)、嵌入式开发中的寄存器操作、数据校验和简单加密混淆。本文通过异或运算在变量交换、状态压缩等经典案例,深入解析这一被低估的位运算利器如何提升代码效率与优雅性。

weixin_30617737的博客 376

深入理解C++ 重载 <十四>按位异或运算符

是 C++ 中的按位异或运算符(Bitwise XOR)。通过运算符重载,我们可以让自定义类型也支持 操作。 是一个二元运算符,重载时可以写成:成员函数:(左操作数是 )非成员函数(友元/自由函数):(更推荐,支持两侧隐式转换)异或有几个非常重要的性质,理解了它们才能设计出有意义的 重载:因为 ,异或天然具备可逆特性,这是它最常用于加密、校验、切换状态的原因。 重载最常见的用途:标志位切换(Toggle): 有则关、无则开状态机 / 奇偶校验:异或天然适合做 parity、checksum加密算法:XO

m0_73457176的博客 330

深入解析C语言异或运算:从面试题到实战应用

位运算是计算机编程中的基础概念,它直接操作数据的二进制位,是底层系统编程和算法优化的核心工具之一。异或运算作为位运算的重要成员,其核心原理在于“相同为0,不同为1”,这一特性使其在特定场景下展现出独特的技术价值。在算法领域,异或运算凭借其自反性和结合律,能够高效解决数据配对、状态切换等问题,例如在时间复杂度O(n)和空间复杂度O(1)的条件下,找出数组中只出现一次的数字。在工程实践中,异或运算常用于简单的数据校验、标志位快速切换以及基础的对称加密混淆。本文以一道经典的C语言面试题为引,深入探讨异或运算在解决

chengyixian7877的博客 371
上一篇: Java动态代理
下一篇: Java 8 日期、时间与格式化
崔显龙
博客等级 码龄15年 95粉丝 64原创
评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值