【Javaノート】ビット演算による数値交換


どの言語を学習しても、JavaではJVMメカニズムの存在によりビット演算の存在感が低くなり、プログラムの可読性のためにビット演算を意図的に使用したくないプログラマーもいます.しかし、ビット演算の優れた性能は、プログラマーとして勉強しなければならない.使うかどうかにかかわらず、その原理と思想を勉強しなければならない.これは私たちに与える影響は潜在的に暗黙化している.基本位演算子:&|^~<<>>>ここでは、その中の異或^異或についてお話しします.
public class Demo8 {
    public static void main(String[] args){
        int x=0b11001;  // 25
        int y=0b10101;  // 21
        System.out.println(x^y);    
        // print 12

        // 11001^10101=01100
    }
}

同位体上に存在する1と0は1であり、その他はいずれも0である.すなわち、異或に現れる1は必ず2つのバイナリ数のうちの1つが上必ず1であり、もう1つの数の対応ビットが必ず0である.すなわち、対応ビットが必ず異なる.交換の2つの数値は次のとおりです.
public class Demo8 {
    public static void main(String[] args){
        int x=1;
        int y=2;
        int z;
        z=x;
        x=y;
        y=z;
        // y=1,x=2
    }
}

すなわち,3番目の中間変数を用いて単純で直接的な交換効果を達成することも,広く用いられる方法である.スマートな学生も、中間変数を必要とせずに2つの数値交換効果を実現できることを発見する可能性があります.以下のようにします.
public class Demo8 {
    public static void main(String[] args){
        int x=1;
        int y=2;
        x=x+y;
        y=x-y;
        x=x-y;
        // y=1,x=2
    }
}

異なるまたは操作は、上記のアルゴリズムと似ていますが、原理も私が上述したように、2つの異なる部分を提出し、まず例を見てみましょう.
    public static void main(String[] args){
        int x=11;   //  1011
        int y=7;    //  0111
        x=x^y;
            //  x=1011^0111=1100  1100             
        y=x^y;
            //  y=1100^0111=1011
        x=x^y;
            //  x=1100^1011=0111
        System.out.println(x+" "+y);
        // print 7 11
    }

皆さんもこのアルゴリズムを知っていると思いますが、その原理は少し知っているかもしれません.
原理は簡単で、まず、11と7のバイナリ数1011と0111を異ならせ、彼らの異なる部分、すなわち1100(以下、異なる部分と呼ぶ)を取り出す.違う部分を手に入れましたが、どうすればいいですか?異なる部分は1100、つまり11は異なるビット、00ビットは同じビット、つまり00ビットでは2つの数が1または0のビットであり、11ビットは2つの数が1の部分しかないので、もし私が1100とそのうちの1つの数を異にしたらどうなるのでしょうか.なぜ数を交換するのですか?まず、异なる部分1100まで、11位に必ず1つの数があることを知っている以上、1つの数が0であることを知っているならば、持って行って异なって、1のと1の异なっているかは0で、别の数の上で対応する位の値になって(この数が1であるため、别の数は必ず0です)、もし1が0と异なっているならば、それに対して1で、同じ道理です.一方、0値については、排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的排他的この0は0であり、この1は1であり、y上の1位と2位は必ずxの上位2位と同じである.同じ異或が出た結果だけが0であるからだ.第3位の異なる部分は1であり、xと異なった後、xの第3位は0であるため、異なるxの第3位は1になるが、考えてみれば、異なる部分の第3位が1である以上、xの第3位とyの第3位は必ず異なる.xが0である以上、yの第3位は必ず1であり、xの第3位が順理に成り立っているのはyの第3位であり、第4位は同じであり、異なる部分は1である.x第4位は1であるため、異或後は必ず0であるが、異なる部分が1である以上、x第4位とy第4位は必ず異なり、x第4位が1である以上、yの第4位は必ず0であるため、異或後x第4位はyの第4位と同じになり、また異なる部分の00位は必ずxとyと同じであるため、異なるか、または後xとyの異なる同位体は、異或がyと同じ値になったため、すなわち、このときxと異なる部分異或後、バイナリ上でyの値になり、yと異なる部分異或を用いると、同じ理屈でxの値になる.なぜ3番目の数を使わなかったのかというと、理屈は前の2番目の例と同じように、一時的にxで異なる部分を格納する容器を作り、y=x^yとなった.このときxは異なる部分であり、y異和後、上記のようにxのバイナリになったからだ.yはこのときすでにxの値であるため、異なる部分とxが異なれば、自然にyのバイナリ、すなわちyの値、すなわちこのときxがyの値が得られる.以上をまとめると、私の上の例の全過程が完成しました.まだ理解できない友達がいれば、ペンを持って紙に簡単に絵を描くことができて、すぐに理解することができます.ビット演算の利点は、直接機械層で数に直面して操作することにほかならない.コンピュータのデータ記憶はいずれもバイナリであるため、理論的にはすべての数値を操作することができる.もちろん、具体的には状況によって決めなければならない.そうしないと、意外な結果を得ることもできる.ビット演算の取捨選択については,この数パーセントの性能を向上させるためにコードの可読性を混同したくない人もいれば,性能こそプログラムの根本であり,特に埋め込み式などの下層開発を行う上で,これが仁者見仁知者見智であると考える人もいる.