异或
平常所学习的异或为:两数异或 相同为0 不同为1
a: 10011
b: 01110
a ^ b = 11101
如何用 异或 实现两数交换
int a = 甲;
int b = 乙;
a = a ^ b; a = 甲 ^ 乙; b = 乙;
b = a ^ b; a = 甲 ^ 乙; b = 甲 ^ 乙 ^ 乙 = 甲;
a = a ^ b; a = 甲 ^ 乙^ 甲 = 乙;
a = 乙 , b = 甲;
不用额外申请空间,但是前提是 a b两数是两块不同内存存储,否则三句话操作下来,值会被抹成0,异或运算与数的先后顺序无关
面试题
1.一个数组中,一个数出现奇数次,其他数出现偶数次,求出这个奇数次的数.
int eor = 0;
for (int cur :arr)
{
eor ^= cur;
}
Sysout(eor);
2.一个数组中,有两个数出现奇数次,其他数出现偶数次,求出这个奇数次的数分别是哪两数.