一.运算法则
异或运算法则为:
a⊕b = (¬a ∧ b) ∨ (a ∧¬b)
即相同为0,不同为1。在计算机语言中,异或的符号为“^”。
举例:0 ^ 0 = 0; 0 ^ 1 = 1; *//可以理解为任何数和0异或,结果为任何数本身。*
1 ^ 0 =1 ; 1 ^ 1 = 0; *//可以理解为任何数和1异或,结果为任何数取反。*
二.用途
-
位反转
举例:10001000 在一些情况下,第四位和第五位需要反转,可以用10001000与00011000进行异或运算。
10001000 ^ 00011000 = 10010000 -
实现两个值的交换,而不必使用临时变量。
例如交换两个整数a=10100001,b=00000110的值,可通过下列语句实现:
a = a^b; //a=10100111
b = b^a; //b=10100001
a = a^b; //a=00000110 -
统计某一位的奇偶数
将某个元素中的每一位逐步异或.
例如a1=1010,则b1=1 ^ 0 ^ 1 ^ 0 = 0,由此可以判断a中为1的位数是奇数还是偶数。
例如a2=10110,则b2=1 ^ 0 ^ 1 ^ 1 ^ 0 =1,由此可以判断a中为1的位数是奇数还是偶数。 -
只出现一次的数字(力扣136)
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。提示:数组中其余元素只出现两次;
0 ^ n = n;int singleNumber(vector<int>& nums) { int len = nums.size(); int result=0; for(int i=0;i<len;i++){ result ^=nums[i]; } return result; }
这种做法的好处是,不需要额外的存储空间。
三.总结
在特定情况下使用异或操作可以减少临时变量。
第一次写博客,多为摘录,如果有错误的地方,还希望大家斧正。
摘录:https://blog.csdn.net/xiezhongyuan07/article/details/79248516