ビット演算-配列内で唯一のペアの数値を見つける方法

トピック1の説明:
ここに画像の説明を挿入
アイデア:XORソリューションの使用

コードデザイン:

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の説明:
ここに画像の説明を挿入
アイデア:
この問題は前の問題よりも単純です。直接XORによって繰り返し数を取得でき、スペースの複雑さは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でAND演算を実行し、
ここに画像の説明を挿入
c
取得し、bでAND演算を実行し、奇数桁を保持し、
cでd取得します。1ビットをシフトします。右に、dを1ビット左にシフトし、XOR演算を実行して、整数のパリティビットを交換した結果を取得します。

コードデザイン:

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
    }

}

おすすめ

転載: blog.csdn.net/fxwentian/article/details/115265853