目录
4.一个数组中,某个数出现奇数次,其他都是偶数次,找到出现奇数次的数
5.一个数组中,a,b出现奇数次,其他都是偶数次,找到出现奇数次的数
简介:
在java里int的范围是 [− ~
],共
个数,占32个字节,其中第一位是符号位 ,1表示负数,0表示整数。
符号 | 名称 | 作用 | 例 |
& | 与 | 同1为1,其他为0 | 1&2 结果为0 |
| | 或 | 不同为1,同1为1,同0为0 | 1|2 结果为3 |
! | 非 | 逻辑取反 | !true结果为false |
~ | 取反 | 原1为0,原0为1 | ~1结果为-2 |
^ | 异或 | 相同为0,不同为1 | 1^2结果为3 |
例如:
1的二进制表示为:0000 0000 0000 0000 0000 0000 0000 0001
-1的二进制表示为:1111 1111 1111 1111 1111 1111 1111 1111
其中负数的表示为 整数取反~ + 1
应用:
1.用二进制表示一个int类型的整数
二进制中的有效数字位共31位,通过&的特性,同1为1,其他为0,
输入参数&1<<i,就能找到二进制位为1的位置,代码如下
public static String print(int num){
StringJoiner joiner = new StringJoiner("");
for(int i = 31;i>=0;i--){
joiner.add((num & (1 << i))== 0 ? "0" : "1" );
}
return joiner.toString();
}
效果如下:
2.使用异或判断2个对象有一个不为空
其中User u1 = new User(); User u2 = new User();
public static boolean notBothNull(User u1,User u2){
if(u1 == null ^ u2 == null){
return true;
}
return false;
}
当u1,u2中有一个不为空则返回true.否则返回false.
3.使用异或进行数组交换
根据异或的特性,相同的两个数异或结果是0,a^b^a 的结果是b,当然这里有个前提,a!=b
private static void swap(int[] arr, int a, int b) {
if (a != b) {
arr[a] = arr[a] ^ arr[b];
arr[b] = arr[a] ^ arr[b];
arr[a] = arr[a] ^ arr[b];
}
}
4.一个数组中,某个数出现奇数次,其他都是偶数次,找到出现奇数次的数
public int odd(int[] arr){
int ans = 0;
for (int i = 0; i < arr.length; i++) {
ans ^= arr[i];
}
return ans;
}
5.一个数组中,a,b出现奇数次,其他都是偶数次,找到出现奇数次的数
public int[] odd(int[] arr){
int ans = 0;
for (int i = 0; i < arr.length; i++) {
ans ^= arr[i];
}
// 提取出最又一个1
int rightOne = ans & (~ans + 1);
int ans1 = 0;
for (int i = 0; i < arr.length; i++) {
if((arr[i] & rightOne)!=0){
ans1 ^ = arr[i];
}
}
return new int[]{ans1,ans1^ans};
}
a,b出现奇数次,ab一定 不相等,通过应用4,得到ans = a^b;
如果ans = 4,二进制表示为:0100,说明,a,b中一定有一个数的第三位上是1;
在数组中找到第三位是1的所有的数,应用异或特性,找到其中的一个数ans1;
另一个数即为ans^ans1;