与&和或|和异或^的巧妙应用
2020-09-16 本文已影响0人
chanyi
&
:与,要求都是1才为1,其他都为0
|
:或,要求有一个为1即可1,全是0为0
^
:异或,要求相同为0,不同为1
1、&的使用
1、计算一个数n转为二进制后,1的个数
可以循环进行n&(n-1),直到n=0
int count=0;
while (n!=0){
count++;
n=n&(n-1);
}
2、判断一个数n的奇偶性
计算n&1,等于0是偶数,1是奇数
System.out.println("5&1="+(5&1));
3、利用每一位表示不同含义
比如在实际的业务场景中有多种情况,并且多种情况可以组合的,则可以将每一种种情况用整数的每一位表示。例如用户的权限有A、B、C三种。并且三种权限可以组合,如用户zhangsan可以有AC权限,lisi可以有ABC权限。这样的情况下,只需要用整数7即可完全表示所有可能的组合,第一位表示A,第二位表示B,第三位表示C,则A对应的是1,B对应的是2,C对应的是4,ABC则对应的是7。
这样的方式可以节省存储空间,计算也高效。
判断时候拥有某权限,只需要&对应的数字,比如6&4=4,则可以得知6拥有C权限。
2、|的使用
|运算表示如果有一个位为1,则为1.
1、如果有负数参与判断,则可以使用|简化
例如:
if(x<1||y<1){
System.out.println("有负数");
}
可以简化改写为:
if( (x|y) <0){
System.out.println("有负数");
}
3、^的使用
1、快速判断两个整数是否相等
主要思想是,两个整数相同,则二进制相同,做异或运算得结果为0
优点是快!因为是位运算。
具体代码
System.out.println(4^4);//输出0
2、两个数交换
主要思想是a^b^a =b,a^b^b=a
这样的方式优点是,不需要借助临时变量
具体代码
int a = 9;
int b = 7;
a=a^b;
b=a^b;
a=a^b;
System.out.println(a+"-"+b);//7-9
3、寻找数组中只出现一次的数,其他数出现两次
代码:
public int singleNumber(int[] nums) {
int num = nums[0];
for (int i=1 ;i<nums.length;i++){
num = num^nums[i];
}
return num;
}
4、将某个整数的指定位反转
利用01=1,11=0的规律,将指定位对应异或1即可。例如将9(1001)的第二位反转。则只需要将(1001^0010)即可;
具体代码
System.out.println(9^2);//输出11,即(1011)