当想要去交换两个不同值得数字时,不止可以用申请变量的方式
int temp=a;
a=b;
b=temp;
还可以使用位运算的方式 a=a^b; b=a^b;a=a^b;
原因:异或的操作就是不进制式运算,就是当两个数异或的时候都是1就变成0,但是前面不进位。异或的有意思的地方是,a^a=0,所以当两个数异或后出现的二进制数为1的地方,就是他们两的数都不一样的地方。
提取一个int类型数的最右侧的1,方法是让这个数和他的相反数做与运算,比如
a=01101110010000
~a=10010001101111
~a+1=10010001110000
a&(~a+1)=00000000010000
这样就找到了最右边的1;
当一个数组里面有两个数出现了奇数次,其他都是偶数次应该怎么找到这两个数并且打印呢;
先让数组里的每一项进行异或运算,因为相同的两个数字异或是0;所以最后留下的就是两个不同的数字a^b, eor=a^b;
再去获得eor的这个数最右边的1的位置,为什么获得1的位置,因为两个数异或出现1,说明在这一位上,两个数一个是1一个是0,如果两个都是1或者两个都是0在这一位相加就变成0了,所以找到这一位是1的异或位置。
rigthone=eor&(~eor+1)
得到这一位后,再让数组里面的每一项去和这个rightone去做异或运算,因为刚刚我们知道再这一位上这两个数异或是1所以肯定是一个是0一个是1,我们把数组中的数字根据这一位分开,再这一位上是1的是一类,是0的是一类,当数组里的每一项和rightone做&运算不是0的时候说明再这一位是1,
eor`=eor`^符合这个条件的每一项,偶数项消失,最后留下的就是奇数次数字其中的一个,让eor`再去和eor做^运算,得到的就是另一个奇数次数字.