ビット演算における異或の応用


この数日、异或に関するいくつかの问题型を见て、ついでに记录をまとめて、自分で后で复习を见ることができます.
  一、何が異或なのか、どのようにもっとよく理解しますか?
  javaでは、ビット演算子に異和の演算子があり、記号(^)で表され、その演算規則は、2つのバイナリオペランドの同じビットで、同じ場合は結果が0で、異なる場合は結果が1です.例を挙げます.
  • 3^10対応するバイナリ=>0011^1010=1001;
  • 2^3対応バイナリ=>10^11=01=1
  •   異或の特徴法則:
  • 0は、1つの数と異なるか、またはそれ自体の
  • を操作します.
  • それ自体が自分と异なったり、体操をしたりして0
  • とします.
  • 異種または動作はまた、交換率
  • を満たす.
      二、異或いは題型の運用
    題目1:配列に一度しか現れない数字を探し出す
      分析:例えば、2 n+1個の数があると仮定し、そのうち2 n個が同じであると仮定すると、異なる数、すなわち1回しか現れない数、例えば:1,2,3,2,1を見つける必要がある.異和演算子を使用すると、次のように書くことができます.
    public static void main(String[] args){
    	int[] arr = {1,2,3,2,1};
    	int n = arr[0];
    	for(int i = 1;i<arr.length;i++){
    		 n = n^arr[i];
    	}
    	 System.out.println(n);
    }
    

    タイトル2:1-1000この1000個の数の中で1001個の要素を含む配列の中に置いて、唯一の1つの要素の値だけが繰り返して、その他はすべて1回しか現れません.各配列要素は一度しかアクセスできず、アルゴリズムを設計し、彼を探し出すことができます.補助空間を使わずにアルゴリズムを設計して実現できますか?
    この問題は前の問題で使った知識点と同じですが、考え方が少し違います.前の問題は同じものを消して、残りは解を求める答えです.この問題は異なるものを消して、残りは同じものが解を求める答えで、私たちはこのように考えることができます:{1,2,3,k,・・・k・・1000}^{1,2,3,・・k・・・1000}このようにもう1組来て、異或を行って答えを出すことができます.
        public static void main(String[] args) {
            int N = 11;
            int[] arr = new int[N];
            for (int i=0;i<arr.length-1;i++){
                arr[i] = i+1;
               // System.out.print(arr[i]+"--");
            }
            //         ,  :[1,N)
            arr[arr.length-1] = new Random().nextInt(N-1)+1;
            for (int value : arr) {
                System.out.print(value + "--");
            }
            System.out.println();
            int x1 = 0;
            for (int i = 1;i <= N-1;i++) {
                x1 = (x1^i);
                System.out.print(x1+"--");
            }
            System.out.println("***"+x1);
            for (int i = 0;i < N;i++) {
                x1 = x1^arr[i];
            }
            System.out.println("   :"+x1);
            }
        }
    

    補足:補助空間を開いて問題を作る
            int[] helper = new int[N];
            for (int i=0;i<N;i++) {
                helper[arr[i]]++;
            }
            for (int i=0;i<N;i++) {
                if(helper[i]==2){
                    System.out.println("   :"+i);
                    break;
                }
            }