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 异或的应用

  1. 不使用第三个变量,交换两个变量的值
int a = 1;
int b = 2;
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println("a:" + a + ", b:" + b);

结果如下
在这里插入图片描述

  1. 对于一个有多个数值的数组,只有一个是唯一的,其他都是成对的,怎样快速找到这个唯一值
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. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值