Python中两个不常用,却重要的运算符
按位与 和 异或 运算符
**&按位与运算符:**转化为二进制,每一位分别进行运算,每一位相同为1,不同为0
**^异或运算符:**0和任何数都是变成那个数(二进制),任何数和自己都会变为0(二进制)
而两个数字直接进行异或,就是转为两个二进制数字进行运算,具体结果要看运算(每一位都异或,相同为0,不同为1,和按位与运算规则正好相反!)
注意:字符数组进行异或操作之前要先进行转码,转为ascii码(js中使用charCodeAt方法)
字符串进行异或操作之前要先split为字符数组,然后再进行转码,转为ascii码
算法例题
一个数组中只有一个数是单独出现的,其他的都是成对出现的,请找出这个数。
大家首先想到把这个数组遍历一遍,然后进行各种操作,但是这里推荐使用一种效率更高的方法——把数
组中所有元素都异或一遍,最后得到的结果就是那个单独出现的数字。
例如数组元素:1 2 4 2 1。
1^2 = 3 (0001 ^ 0010 = 0011)
3^4 = 7 (0011 ^ 0100 = 0111)
7^2 = 5 (0111 ^ 0010 = 0101)
5^1 = 4 (0101 ^ 0001 = 0100)
最后结果为4
代码:
#include<stdio.h>
#include<windows.h>
int main()
{
int a[] = { 1, 2, 3, 4, 5, 4, 3, 2, 1 };
int len = sizeof(a) / sizeof(a[0]);
int i=1;
for (; i < len; i++){
a[0] ^= a[i];
}
printf("多余的数是%d\n", a[0]);
system("pause");
return 0;
}
理解:因为任何数异或自己都会变为0,而0异或任何数都会变成那个数
那我们在运算时,可以把异或得到的结果当成total,那么当total再次遇到一样的元素就会减去这个元素,从而相当于没有处理过这个元素
那么没有被成对处理的元素就会成为最后的输出值!