算法 - 异或操作(^)的妙用

结论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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值