结论1. 异或操作满足交换律和结合律
如a ^ b ^ c 等价于 a ^ c ^ b , 也等价于c ^ b ^ a 等(这里使用的是交换律)
如a ^ b ^ c 等价于 (a ^ b) ^ ' 这里使用的是结合律
结论2. a ^ a = 0, a ^ 0 = a
如 a = 3, 011
a ^ a => 011 ^ 011 => 000 = 0
a ^ 0 => 011 ^ 000 => 011 = 3
结论3. 一个数与另一个数异或两次等于本身
如a ^ b ^ b = a , a^ b ^ a = b
分析:a ^ b ^ a = a ^ a ^ b (交换律) = (a ^ a) ^ b(结合律) = 0^b(结论2) = b
结论4.扩展(多次异或)
a ^ b ^ a ^ b ^ a = (a ^ a) ^ (b ^ b) ^ a = (0 ^ 0) ^ a = 0 ^ a = a
结论5.
a ^ 1 => 1) 如果a为奇数,则 a ^ 1 为 a - 1;
2) 如果a为偶数,则 a ^ 1为 a + 1;
在二进制中,偶数的最后一位是0,0^1=1,异或运算后偶数最后一个位变成1,偶数+1 奇数的最后一位是1,1^1=0,异或运算后奇数最后一个位变成0,也就是奇数+1 (其他高位都是1^0=1 不变)
算法举例
在不考虑字符排列的条件下,对于相差只有一个字符的两个字符串,实现一个算法来识别相差的那个字符。要求如下:
- 当传入的字符串为
'aad'
和'ad'
时,结果为'a'
。 - 当传入的字符串为
'aaabccdd'
和'abdcacade'
时,结果为'e'
。
python实现:
class Solution(object):
def find_diff(self, str1, str2):
if str1 is None or str2 is None:
raise TypeError('str1 or str2 cannot be None')
result = 0
for char in str1:
result ^= ord(char)
for char in str2:
result ^= ord(char)
return chr(result)
c语言实现:
#include<iostream>
#include<cstring>
int find_diff(char a[], char b[]){
int result = 0;
for(int i=0;i<strlen(a);i++){
result = result ^ a[i];
}
for(int i=0;i<strlen(b);i++){
result = result ^ b[i];
}
return result;
}
int main() {
char c = find_diff("aaabccdd", "abdcacade");
printf("%c", c);
}