Java中 ^异或 &相与小常识
学过基本逻辑运算符我们知道 ^ 异或是什么意思
无外乎:相同为零,相异为1。
即 0 ^ 1 = 1,0 ^ 0 =0,1 ^ 1 = 0;
延伸至变量 :a ^ a = 0; a ^ 0 = a;
我们经常在某些交换值的算法中用到
void swap(int &a, int &b){
a = a^b;用a来当作中间桥梁
b = a^b;(即是(a ^ b) ^ b = a ^ 0 = a);//这样即是交换了a和b的值
a = a^b;//同理这个时候变成了 (a ^ b) ^ a = b;
}
所以来看这道入门题,参照网上一些大神的解法:
有1~1000这1000个数,放在大小为1001的数组中,只有一个元素值重复,要求不用辅助空间,每个数访问一次,找出重复的元素
不难得到:
public class Yihuo {
public static void main(String[] args) {
int x = 0;
int[] arr = new int[1001];
//解释说明一下,因为是开了一个1001的数组,但是又因为有一个数重复
所以是arr.length -1
for (int i = 0; i < arr.length-1; i++) {
arr[i] = i + 1;
// System.out.println(arr[i]);这里可以自己测试一下
}
arr[arr.length -1] = new Random().nextInt(1000)+1;
//让这个重复的数随机生成
//这里就是让 x ^ i(相当于0^1^2……),
感到疑惑的小伙伴可以打印出来看看 ,你会发现最后相当于x = 0;很神奇
for (int i = 1; i < arr.length-1; i++) {
x = x ^ i;
System.out.println(x);
}
//最后再用这个x ^arr[i],这里就可以找出重复的值
(0 ^ 重复的数时,必然会让这个数显性)
for (int i = 0; i < arr.length; i++) {
x = x^arr[i];
}
System.out.println(x);
}
这里做一个小小记录,如果有不懂的小伙伴,再建议多找找其他技术帖看看。。
这里奉上另一位大神的思路:
https://blog.csdn.net/qq_45784913/article/details/104172655