你知道异或运算吗?

5 篇文章 0 订阅
3 篇文章 0 订阅

什么是异或运算?

异或,英文为exclusive OR,缩写成xor
异或(xor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为:
a⊕b = (¬a ∧ b) ∨ (a ∧¬b)
如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
z = x ⊕ y
z = x xor y
以上两个式子是等价的

– 引用自百度百科

如何理解异或

两种方法理解异或

  1. 二进制计算
    在我们最初学习编程语言的时候,一定遇到过一个问题:
    如何交换两个变量的值?假设int a = 1, b = 2,借助一个 int 变量 tmp 暂时存储第一个需要被赋值的变量,就可以实现,代码如下:
    // 注意java中只有传值引用,要写一个函数来交换,需要额外加入一个数组来存储结果
    public static void main(String[] args){
    	int a = 1, b = 2;
    	int tmp = a;
    	a = b;
    	b = tmp;
    	System.out.println("a:" + a + " b:" + b);
    }
    
    可以看到我们需要一个额外的空间来完成交换,那可不可以不用额外空间交换变量的值呢?异或是一个有效的解决方案。
    根据运算法则,相同取0,不同取1。
    同样假设: a = 1, b = 2
    a = a ^ b
    b = a ^ b
    a = a ^ b
    //转换成
    a = 001 ^ 010 = 011 -> 3 
    b = 011 ^ 010 = 001 -> 1
    a = 011 ^ 001 = 010 -> 2
    // 是不是得到了 a = 2 , b = 1
    
    在c/c++中我们可以用来交换指针:
    *p = *p ^ *s ;
    *s = *p ^ *s ;
    *p = *p ^ *s ;
    
    是不是很神奇?不过,可能这样的理解还是不够直观,我们可以借助集合来理解
  2. 韦恩图
    1. 假设我们有两个集合A,B,它们有一块公共的交集。那么在A∨B的情况下,是下面这张图:
      在这里插入图片描述
    2. 如果按照xor运算,它就会变成(¬A ∧ B) ∨ (A ∧¬B):
      在这里插入图片描述
    3. B = Aoxr(AoxrB) = A
      在这里插入图片描述
    4. A = Boxr(Aoxr(AoxrB)) = B
      在这里插入图片描述
      — 图片来自wikipeida
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值