体系--01---异或运算
作者:互联网
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
异或运算
前置知识
初级–01—二进制、位运算
初级–05— 取模运算转化为位运算、位运算进行加减乘除
num >> 6 相当于 num/64
认识异或运算
异或运算性质
题目1
public static void swap (int[] arr, int i, int j) {
// arr[0] = arr[0] ^ arr[0];
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
注意: 保证上诉参数,i和 j 的地址值不一样
题目2
// arr中,只有一种数,出现奇数次
public static void printOddTimesNum1(int[] arr) {
int eor = 0;
for (int i = 0; i < arr.length; i++) {
eor ^= arr[i];
}
System.out.println(eor);
}
题目3
eor & (-eor) 或者 eor & (~eor+1)
题目4
假设奇数次的数 是 a,b
- 数组循环异或得到结果 eor=a^b
- 提取 eor 最右测的1出来 作为rightOne
(a和b ,其中有一个此位置 必然是1 ,另一个此位置必是0,不然亦或此位置不会是1) - 数组循环异或此位置是1的数===>得到a 或者b
(那么数组中,此位置是1的数,一定分2中,一种是数组出现了偶数次的,一种是a,或者是b) - 通过上述 eor=a^b 找出,====>找出另一个奇数的数a,b的另一个数
// arr中,有两种数,出现奇数次
public static void printOddTimesNum2(int[] arr) {
//步骤1
int eor = 0;
for (int i = 0; i < arr.length; i++) {
eor ^= arr[i];
}
// a 和 b是两种数
// eor != 0
// eor最右侧的1,提取出来
// eor : 00110010110111000
// rightOne :00000000000001000
// 步骤2
int rightOne = eor & (-eor); // 提取出最右的1
// 步骤3
int onlyOne = 0; // eor'
for (int i = 0 ; i < arr.length;i++) {
// arr[1] = 111100011110000
// rightOne= 000000000010000
if ((arr[i] & rightOne) != 0) {
onlyOne ^= arr[i];
}
}
// 步骤4
System.out.println(onlyOne + " " + (eor ^ onlyOne));
}
题目5
异或运算–01—arr中,只有一种数出现了K次,其他数都出现了M次
标签:arr,01,题目,运算,eor,--,---,int,异或 来源: https://blog.csdn.net/weixin_48052161/article/details/122520917