天津市工程建设项目报建网站,网络营销有什么岗位,赚钱的网站平台,wordpress使用latex乱码异或运算大家都知道指的是对于两个数转准成二进制之后#xff0c;相同位置上的如果同时为或者#xff0c;那么异或的结果就是0#xff0c;不同就是1#xff0c;比如01异或00结果是01#xff0c;但是时间长了相信大家都很容易记混#xff0c;那么有一种很好记的方式#…异或运算大家都知道指的是对于两个数转准成二进制之后相同位置上的如果同时为或者那么异或的结果就是0不同就是1比如01异或00结果是01但是时间长了相信大家都很容易记混那么有一种很好记的方式就是异或其实就是无进位的加法比如00异或01就是0001但是要直接丢弃进位所以异或运算具有以下特性
1、任何数与0异或结果是这个数本身
2、任何数和它自己异或结果是0
那么异或运算可以解决哪些问题呢
第一题不用临时变量交换两个数其实这个题是很恶心人的用一个临时变量怎么了 private void exchange(int a, int b) {System.err.println(a - b);a a ^ b;//b的值不变b a ^ b;//把前面a的值代入等同于ba^b^b;a a ^ b;//把前面a的值代入等同于ba^b^a;System.err.println(a - b);}Testpublic void testExchange() {exchange(2, 3);}
第二题给定一个数组只有一个数在其中出现了奇数次其他的数出现偶数次找出这个数
思路用一个临时变量tmp初始值为0从数组开头一直异或到结尾最后tmp就是要找的数
举个例子[1,2,3,4,1,2,4]我们要找的数据是3根据前面的结论任何一个数异或0等于它本身同一个数异或它自己等于那么这个数组其实我们把它排序看看[1,1,2,2,3,4,4]所以1,2,4在与tmp异或完之后tmp等于0最终结果就是3了 private int findOddNumTimes(int[] arr) {int tmp 0;for (int i : arr) {tmp tmp ^ i;}return tmp;}Testpublic void testfindOddNumTimes() {System.err.println(findOddNumTimes(new int[]{1, 2, 3, 4, 1, 2, 4}));}