位运算的奇巧淫记
1. 判断奇偶数
偶数:x&1=0
- eg: 10的二进制为10010 10010&1=0
奇数:x&1=1
- eg:3的二进制为11 11&1=1
2. 在数组中找出唯一成对的数
1-1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素值重复,其他均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现?
import java.util.Random;
public class text1 {
public static void main(String[] args) {
int N = 1001;
int[] arr = new int[N];
for(int i = 0; i < arr.length-1; i++){
arr[i] = i+1;
}
// 最后一个数,是随机数
arr[arr.length-1] = new Random().nextInt(N);
// 随机下标
int index = new Random().nextInt(N);
// 将最后一个数和随机下标对换
int temp = arr[arr.length-1];
arr[arr.length-1] = arr[index];
arr[index] = temp;
// 打印数组
for(int i = 0; i < arr.length; i++){
System.out.print(arr[i]+" ");
}
System.out.println();
// 找出重复的数
int x1 = 0;
for(int i = 1; i <= N-1; i++) {
x1 = x1^i;
}
for(int i = 0; i < arr.length; i++) {
x1 = x1^arr[i];
}
System.out.println(x1);
// 暴力破解
for(int i = 0; i<arr.length; i++) {
for (int j = i+1; j<arr.length; j++) {
if(arr[i]==arr[j]) {
System.out.println(arr[i]);
return;
}
}
}
}
}
3. 异或运算符
性质:
- 交换律 可任意交换运算因子的位置,结果不变
- 结合律 (即(a^b) ^c == a ^(b ^c) )
- 对于任何数x, 都有x^x=0, x ^0=x, 同自己求异或为0, 同0求异或为自己
- 自反性 A^ B ^B = A ^0 = A,连续和同一个因子做异或运算,最终结果为自己