标签:arr 01 题目 运算 eor -- --- int 异或
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
异或运算
前置知识
初级–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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。