java异或_Java异或运算总结
异或运算的性质:
异或运算是基于⼆进制的位运算,采⽤符号XOR或者^来表⽰,运算规则是就与⼆进制,如果是同值取0、异值取1。
简单的理解就是不进位加法,例如1+1=0,0+0=0,1+0=0;
性质:
1. 交换律 可以任意交换运算因⼦,结果不变。
2. 结合律 (a^b)^c=a^(a^c)
3. 对于任何数x,都有x^x=0,x^0=x,同⾃⼰求异或运算为0,同0求异或运算结果为⾃⼰
4. ⾃反性,A^B^B=A^0=A。这个性质可以⽤来求哪⼀个数为⼀个
⽤法实例:
例⼀:在不引⼊第三个变量的情况下,两个变量的值(整数)
//交换a、b的值
例⼆:判断奇数偶数更简单更⾼效的做法
//这个实际考的不多, 太简单
//思路:奇数的⼆进制最低为⼀定为1,偶数的⼆进制最低位⼀定为0,
a^1==1?偶数:奇数
例三:找出唯⼀⼀个成对的数
题⼲:题⼲:1-1000这1000个数放在含有1001个元素的数组中,只有唯⼀的⼀个元素值重复,其它均只出现 ⼀次。每个数组元素只能
访问⼀次,设计⼀个算法,将它找出来;不⽤辅助存储空 间,能否设计⼀个算法实现?
第⼀种解题思路:将所有的数加起来减去(1+2+……+1000)。但是这个有可能导致内存溢出
//第⼆种思路:
将所有的值异或运算,结果再与(1^2^3……^1000)异或运算
结果相当于(1^1^2^2……1000^1000^k)最终的结果就是k
例题五:找出唯⼀落单的那个数字(也就是仅仅出现⼀次的那个数)
结果=a[0]^a[1]^...^a[n-1]
例题六:(难度增加)找出数组中落单的那两个数
题⽬:⼀个整型数组⾥除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现⼀次的数字。要求时间复杂度是
O(n),空间复杂度是O(1)。