异或练习

//一个数组中有一个数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这个数
    // 要知道 N ^ N = 0 所以将全部的数异或起来  就是那个出现奇数次的数
    public static void printOddTimesNum1(int []arr){
        int eor = 0;

        for(int i = 0;i<arr.length;i++){
            eor ^= arr[i];
        }
        System.out.println(eor);
    }

    //一个数组中有两个数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这两种数
    public static void printOddTimesNum2(int[] arr){
        int eor = 0;
        for(int i = 0;i<arr.length;i++){
            eor ^= arr[i];
        }
        // eor = a ^ b
        // eor != 0  因为是两个不同的数
        // eor 必然有一个位置上是1
        int rightOne = eor & (~eor + 1); //提取出最右的1   //给定一个int类型的数 提取出最右侧的 1 来   这里说明, 只有一个数在这一位是1 另一位是0
        int onlyOne = 0; //eor'
        for(int i = 0;i<arr.length;i++){
            if((arr[i] & rightOne) != 0)  //这里只有 a 或 b 其中一个数会进到下面的语句  那么就类似在数组中找一个出现了奇数次的数  把rightOne位上是1的数全部提取出来
                onlyOne ^= arr[i];
        }

        System.out.println(onlyOne + "   "+ (eor ^ onlyOne));
    }


    public static int bit1Count(int N){
        int count = 0;
        while(N != 0){
            int rightOne = N & ((~N) + 1);
            count++;
            N ^= rightOne;
            //N -= rightOne;  是负数就凉凉了
        }

        return count;
    }


    //给定一个int类型的数 提取出最右侧的 1 来
    //举例:  N =  001001001010000
    //结果:ANSER= 000000000010000

    //分析:       N     001001001010000
    //          ~N      110110110101111
    //          ~N+1    110110110110000
    //结果 N & (~N+1)   000000000010000  提取到最右侧的1
//    int rightOne = eor & (~eor + 1); //提取出最右的1

    public static void main(String[] args) {
        int[] arr = {1,2,2,2,2,3,3,4};
        printOddTimesNum2(arr);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值