^ | & 运算

294 阅读1分钟

一、^

1、简介两个数做^ 变为二进制 相同的的变为0 不同的变为1

例如: 10010 ^ 10000 -> 00010

2、性质

0^n=n;

n^n=0

满足交换律和结合律

交换两个数

int a=甲 int b=已

a=a^b a变成甲^乙

b=a^b 甲^乙^乙=甲

a=a^b 甲^乙^甲=乙

3、常见考点

1、找出一个数组中一种数出现了奇数次,其余全是偶数

直接让数组全部异或运算,最后结果就是这个数

2、找数组中两个数是奇数个的数

假设这两个数分别是a,b

首先让数组全部异或运算,得到e=a^b

然后用上面的结合计算把e最右侧1取出来 记作w

在这个位置上,a,b两个数肯定一个是1,一个是0

然后遍历数组和w&运算,因为w只有一位为1,其余为0,

public void find(int []arr){
    int eor=0;
    for(int i=0;i<arr.length;i++){
        eor=eor&arr[i];
    }
    
    //eor=a^b 且!=0
    //取出最右边的1
    int rightone=eor&(~(eor)+1);
    int onlyone=0;
    for(int i=0;i<arr.length;i++){
        if((arr[i]&(rightone))!=0){
            onlyone=onlyone^arr[i];
        }
    }
    System.out.println(onlyone+"  "+(eor^onlyone));
}

二、&

1、性质

同时为1才取1 取出第i位的数字 int u=x>>i&1

a&-a可以得到最右边的1

2、例题

import java.util.*;
public class Main{
    public static void main(String[]args){
        Scanner in=new Scanner(System.in);
        int n=in.nextInt();
        for(int i=0;i<n;i++){
            int sum=0;
            int x=in.nextInt();
            while(x>0){
                int a=method(x);
                x=x-a;
                sum++;
            }
            System.out.print(sum+" ");
        }
    }
    public static int method(int a){
        return a&(-a);
    }
}

三、|

微信截图_20220915025144.png