按位与和异或运算符(Python中两个不常用,却重要的运算符)

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再次遇到一样的元素就会减去这个元素,从而相当于没有处理过这个元素

那么没有被成对处理的元素就会成为最后的输出值!

猜你喜欢

转载自blog.csdn.net/m0_58768224/article/details/129796580