异或运算及异或运算的应用

0.前言

1.定义

异或是一个数学运算符,它应用于逻辑运算
数学符号⊕
计算机符号 eor

1.1运算:

a ⊕ b = (¬a ∧ b ) ∨ (a ∧ ¬b)

1. a、b两值相同,则异或结果为0;a、b两值不同,则异或结果为1
2. 也可以说是“不进位相加”——半加运算

1.2法则:

  1. 归零率 a ⊕ a = 0
  2. 恒等率 a ⊕ 0 = a
  3. 交换律 a ⊕ b = b ⊕ a
  4. 结合律 a ⊕ b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c
  5. 自反 a ⊕ b = b ⊕ a
  6. d = a ⊕ b ⊕ c 可以推出 a = d ⊕ b ⊕ c

2.应用

2.1交换两个变量的值

int a = 12;
int b = 4;
// 执行完如下语句a的值为a ⊕ b
a = a ^ b;
// 执行下面的预计隐藏的含义是 b = a ⊕ b ⊕ b,根据归零率和恒等率得 b = a
b = a ^ b;
// 执行下面的预计隐藏的含义是 a = a ⊕ a ⊕ b,根据归零率和恒等率得 a = 原b
a = a ^ b;
// 执行完成这3句话 a、b的值就交换了

2.2只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
解题原理:根据交换律、结合律,把出现两次的数据都按归零率归零了,唯一一个元素跟零按恒等率得到唯一元素值

public static void main(String [] args){
    
    
	int [] data = new int [] {
    
    1,1,3,2,1,1,4,3,4,5,5};
	int eor = 0;
	for(int item : data ) {
    
    
		eor ^= item;
	}
	System.out.println(eor);
}

2.3两个不同的数字

给定一个非空整数数组,除了某两个元素只出现一次以外,其余每个元素均出现两次。找出这两个的元素。
解题原理:

  1. 假设a、b是非空数组里的只出现一次的数据。把这个数组所有数据异或起来最后只余下 a ⊕ b
  2. 因为a与b不一致所以a转换为二进制与b转换为2进制后的数据肯定至少有一位不一样,找出这一位(怎么找下面买描述)
  3. 再从列表中找到与这个二进制位一样的数据(下面再描述怎么找),把这些数据进行异或,就能得到其中一个不一样的数字。(这样想,非空数组中的而所有数字转换成进制,这些数字中的其中一位不是0就是1,我们按照第二步中找到的二进制位置把数组分成两组。这两组中的一组,这位二进制肯定都是一样的,而题干中相同的元素这个二进制位置上的数字肯定一样,这样这组数字全部异或就只剩下那个这组中的唯一个没有出现过两次的数字)
  4. 最后,把第3步中得到的数据与第一步中异或的结果再异或就得到另外一个不一样的数据。

实现:



文文的博客:躬身自省,淳朴而谦逊否

おすすめ

転載: blog.csdn.net/weixin_42119415/article/details/120059005