Java异或运算和位运算
1 异或运算
1.1 异或运算介绍
简单点说就是:相同为0,不同为1。另外,任何数与0异或的结果为自己本身,任何数与自己异或结果为0:
- n ^ n = 0
- n ^ 0 = n
异或运算满足的法则:
- a ^ b = b ^ a (交换律)
- a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c (结合律)
- d = a ^ b ^ c 可以推出 a = d ^ b ^ c
1.2 异或的应用
- 不使用第三个变量,交换两个变量的值
int a = 1;
int b = 2;
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println("a:" + a + ", b:" + b);
结果如下
- 对于一个有多个数值的数组,只有一个是唯一的,其他都是成对的,怎样快速找到这个唯一值
int[] numarry = new int[]{1,2,3,2,3};
int target = numarry[0];
for(int i = 1; i < 5; i++)
{
target = target ^ numarry[i];
}
System.out.println("最后:"+target);
异或运算满足上边的交换规则,对于 1^2^3^2^3
这样的异或运算,我们换一下位置(2^2)^(3^3)^1
,通过两个相同的数进行异或运算得到0 ,那最终就会是0^0^1
,最后会得到1 。
- 1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现?
假设:1 ^ 2 ^ 3 ^ ...... ^ 1000 = X
现在:1 ^ 2 ^ 3 ^ n ^ ...... ^ 1000 = X ^ n
而且:X ^ X ^ n = n
所以这道题的解法是:首先对1~1000的值进行异或运算得到X,然后对这1001个数进行异或运算得到Y,最后X与Y进行异或运算即可得到这个重复的数字。
2 位运算
2.1 左移位运算 <<
左移几位就是乘以2的几次幂
System.out.println(12 << 1);
System.out.println(12 << 2);
2.2 右移位运算 >>
右移几次就是除以2的几次幂
System.out.println(12 >> 1);
System.out.println(12 >> 2);
参考
https://blog.youkuaiyun.com/wohaqiyi/article/details/80931693