位运算-如何找数组唯一成对的那个数

题目1描述:
在这里插入图片描述
思路:采用异或解法

代码设计:

package T;

import java.util.Random;

public class Main {


    public static void main(String[] args) {

            int []array=new int[12];//简化版   方便寻找

            for(int i=1;i<=10;i++)
                array[i]=i;

            array[11]=new Random().nextInt(11)+1;


            for(int i=1;i<=11;i++)
                System.out.print(array[i]+" ");

        System.out.println();



            int x=0;
            for(int i=1;i<=10;i++)
                x=x^i;//异或操作 生成 1-10

            for(int i=1;i<=11;i++)
                x=x^array[i];//再次异或 得出重复的那个数

        System.out.println(x);

    }

}

题目2描述:
在这里插入图片描述
思路:
这题比上题更简单,直接异或,就可得出重复的数,空间复杂度为O(1)

代码设计:

package T;



public class Main {


    public static void main(String[] args) {

            int []array={1,1,2,2,3,4,5,6,4,5,6};

            int l=array.length;


            int x=0;
            for(int i=0;i<l;i++)
                x=x^array[i];//直接异或

        System.out.println(x);



    }

}

题目3描述:
在这里插入图片描述
代码1设计:

package T;



public class Main {


    public static void main(String[] args) {

           int n=8;

           int count=0;
           while (n!=0){

               count+=n&1;
               n>>>=1;

           }
        System.out.println(count);


    }

}

代码2设计:

package T;



public class Main {


    public static void main(String[] args) {

           int n=8;

           int count=0;
           while (n!=0){

               n=n&(n-1);//消除低位1  1000  消一次
               count++;//总共多少次与操作 就代表多少个1

           }
        System.out.println(count);


    }

}

题目4描述:
在这里插入图片描述
代码设计:

package T;



public class Main {


    public static void main(String[] args) {

           int n=10;
           
           if((n&(n-1))==0)
               System.out.println("Yes");//一个1
           else System.out.println("No");

    }

}

题目5描述:将整数的奇偶位互换
思路:
在这里插入图片描述
将某个数,与a做与运算,保留偶数位,得到c
将某个数,与b做与运算,保留奇数位,得到d
在将c右移一位,d左移一位,在做异或操作,得到的就是整数的奇偶位互换的结果

代码设计:

package T;



public class Main {


    public static void main(String[] args) {

          int n=9;


          int a=n&0xaaaaaaaa;//从左数 得到偶数位    int型 32位表示   二进制表示0b10101010_10101010_10101010_10101010
          int b=n&0x55555555;//从左数 得到奇数位

          int result=(a>>1)^(b<<1);//偶数左移一位 奇数右移一位
        System.out.println(result);//result=6
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值