「这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战」。
位运算
基础知识
| 与 | 或 | 异或 | 非/取反 |
|---|---|---|---|
| & | | | ^ | ~ |
'>>' 和'<<'运算符可以将计算机中用来储存数字的二进制位右移或者左移一位。
'>>>'运算符在位移的时候会用0填充高位,'>>'会用符号位来填充高位,没有'<<<运算符'。
如果位移运算符位移的位数大于数据类型存放数据位数大小,会进行取余后在进行位移操作,比如:1<<35和1<<3是一样的。
在java语言中计算机储存数字是按补码储存的。
正数:补码=反码=原码;
负数:补码=反码+1;
题目
1).如何找到数组中唯一成对的那个数?
2).找出唯一落单的那个数
思路:利用异或运算来计算这个数字
从规律3中可以看出任意一个数字异或自身为0,任意一个数字异或0为自身。利用这一条规律我们可以解决这个问题。
1)解:
package 蓝桥杯;
import java.util.Random;
public class Test1 {
public static void main(String[] args) {
// 构建数组
int [] a = new int[1001];
int N = 1001;
for (int i = 0; i < N - 1; i++) {
a[i] = i + 1;
}
a[N - 1] = new Random().nextInt(N - 1) + 1;
// 重复的数
System.out.println(a[N - 1]);
int index = new Random().nextInt(N);
int t = a[N - 1];
a[N - 1] = a[index];
a[index] = t;
// 查找重复的数
t = 0;
for (int i = 0; i < N; i++) {
t = (t^i);
}
for (int i = 0; i < N; i++) {
t = (t^a[i]);
}
System.out.println(t);
}
}
2)解:
package 蓝桥杯;
public class Test2 {
public static void main(String[] args) {
int [] a = {1,1,2,2,3,4,4,5,5};
int t = 0;
for (int i = 0; i < a.length; i++) {
t = (t^a[i]);
}
System.out.println(t);
}
}