Bitoperationen und Binär

Vorwort

Es zeichnet hauptsächlich einige Operationen binär auf, was für eine effiziente Problemlösung praktisch ist.

Grundlegende Operationen und Regeln

Lassen Sie uns zuerst über die grundlegenden Operationsregeln dieser Bitoperation und die Grundregeln sprechen, die zur Lösung von Problemen verwendet werden können.

& Operation

1&1=1

1&0=0

0&0=0

^ Betrieb

1^1=0

1^0=1

0^0=0

| Betrieb

1|1=1

1|0=0

0|0=0

Links- und Rechtsschaltbetrieb

a<<1: a wird um eins nach links verschoben

a>>1: a wird um eins nach rechts verschoben

Grundgesetz

1. Wenn ein Computer Operationen durchführt, führt er im Wesentlichen binäre Operationen aus, was bedeutet, dass wir diese Eigenschaft voll ausnutzen können, um unerwartete Ergebnisse zu erzielen.

2. Die Summe von K Zahlen in K Basis ohne Übertrag ist 0

3. Ein binäres Bit wird mit 1 XOR-verknüpft, um den aktuellen Zustand zu speichern

4. Die Subtraktion von Binärzahlen wandelt die niedrigste 1 in 0 um

Wenn dies mit unserem Gesetz 1 kombiniert wird, werden viele sehr interessante Operationen stattfinden.
Dann werde ich der Reihe nach einige Verwendungen vorstellen.

Fall

^ Rechentricks

Geben Sie eine Anforderung an, zum Beispiel ein Array [1,1,2,2,3,3,4,5,5]

Bis auf eine bestimmte Zahl erscheinen alle anderen Zahlen paarweise, und jetzt finden Sie die Zahl, die nicht paarweise vorkommt, wie im Beispiel 4.

Schema 1 Hash-Verfahren

Zunächst einmal ist es einfach, an die Hash-Methode zu denken, aber in diesem Fall ist die Platzkomplexität offensichtlich nicht gut, und es ist notwendig, das Hash-Array einmal zu durchlaufen, um die Antwort zu kennen.

public class 位运算1 {
    
    

    public static void main(String[] args) {
    
    

        int[] a = new int[]{
    
    1,1,2,2,3,3,4,5,5};

        int[] hash = new int[a.length];

        for (int j : a) {
    
    
            hash[j]++;
        }

        for (int i = 0; i < hash.length; i++) {
    
    
            if(hash[i]==1){
    
    
                System.out.println(i);
            }
        }

    }

}

Szenario 2 ^ Betrieb

Die Zeit und der Platz der Lösung sind nicht gut. Wenn Sie diese Lösung also lösen möchten, müssen Sie die Operation ^ verwenden.

Seit: 1^1=0 0^0=0

Wenn also 3 und 3 XOR-verknüpft werden, muss das Ergebnis 0 sein, also sind die gepaarten XORs alle 0, dann sind 0 und 4 XORs natürlich 4

public class 位运算1 {
    
    

    public static void main(String[] args) {
    
    
        //找出不同
        int[] a = new int[]{
    
    1,1,2,2,3,3,4,5,5};

          int x = 0;
          for (int i : a) {
    
    
              x = x^i;
          }
          System.out.println(x);
    }

}

Zähle die Anzahl der Bits, die 1 sind

Bitten Sie bei einer gegebenen Dezimalzahl zu sehen, wie viele Einsen in den Ziffern der Dezimalzahl enthalten sind

Zum Beispiel hat 3–>011
hier zwei

Da es hier viele Lösungen gibt, werde ich hier gemeinsam darüber sprechen.

Der einfachste Weg, damit umzugehen

Ebenso ist es leicht vorstellbar, diese Dezimalzahl direkt in eine Binärzahl umzuwandeln und dann 1 zu zählen.

public class 运算二 {
    
    
    public static void main(String[] args) {
    
    
        int a = 3;
        char[] chars = Integer.toString(a, 2).toCharArray();
        int count = 0;
        for (char aChar : chars) {
    
    
            if(aChar=='1'){
    
    
                count++;
            }
        }
        System.out.println(count);
    }
}

Dies ist eine der einfachsten Optionen, die man sich vorstellen kann. Hier können Sie also tatsächlich Bitoperationen verwenden, um dies schnell zu erledigen.

Schichtbetrieb verwenden

Bild.png

Die Denkweise ist so, und es ist einfach zu schreiben.

public class 运算二 {
    
    
    public static void main(String[] args) {
    
    
        int a = 3;
        int count = 0;
        for (int i = 0;i<32;i++){
    
    
            //4个字节32位
            if((a&(1<<i)) == (1<<i)){
    
    
                count++;
            }
        }
        System.out.println(count);
    }
}

Natürlich wird hier die Linksverschiebung verwendet, und es ist in Ordnung für uns, a nach rechts zu verschieben.

Subtrahiere 1 magische Anwendungen

Denken Sie an Punkt 3, den ich zuvor geschrieben habe.
wenn eine Zahl wie a=3

Bild.png

public class 运算二 {
    
    
    public static void main(String[] args) {
    
    
        int a = 3;
        int count = 0;
        while (a!=0){
    
    
            a = a&(a-1);
            count++;
        }
        System.out.println(count);
    }
}

| Übergang des Betriebszustands

Erinnerst du dich an unser vorheriges Thema?

Zustandskomprimierung + dynamische Programmierung (Blue Bridge Cup 2019 Java Group A Candy Problem)

Darin steckt eine sehr clevere Sache, die darin besteht, die folgende einzelne primitive Gruppe in eine Zustandszahl umzuwandeln, was für dp praktisch ist

6 5 3  
1 1 2  
1 2 3  
1 1 3  
2 3 5  
5 4 2  
5 1 2  
6 5 3    状态压缩
		二进制  十进制
1 1 2   00011	3
1 2 3	00111	7
1 1 3	00101	5

Unser Code funktioniert so

w[i] |=(1<<k-1) ;

Dieses w soll unseren Zustand retten.
Zu dieser Zeit bedeutet dp, wie viele Bonbons im aktuellen Zustand benötigt werden.

Hier ist ein wenig über den Aufbau des dp-Arrays, Sie müssen nur daran denken, dass der Wert dieses dp immer gespeichert wird, die aktuelle optimale Lösung, wie dieses Süßigkeitenproblem, erfordert die minimale Anzahl von Paketen, siehe zuerst kleinste und größte Worte, es muss heißen Es ist dp oder greedy, aber jeder, der Gier versteht, versteht, direkt dp (nichts anderes als 0-1 Rucksackproblem oder mehrere Rucksäcke usw.) zu betrachten, um diese Anzahl von Paketen zu verlangen, dann muss es be dp[i] = value Der Wert muss die Anzahl der Pakete sein, dann Was das i ist, dann muss es eine Variable sein, die den Wert bestimmt oder beeinflusst. Wenn wir also nicht wissen, wie wir den Zustand hier speichern können, dann ist der dp, den wir schließlich bauen, sehr wahrscheinlich so dp[][][]...=Wert Die Anzahl von [] hängt davon ab, wie viele Süßigkeiten Sie haben verfügen über.

Wie sich das umwandelt, habe ich vorher nicht deutlich gemacht, also sage ich es hier noch einmal.
Eigentlich ist es ganz einfach: Was wir am Ende machen wollen, ist
die binäre Form des Formats 0 0 0 0 0 (natürlich wird es am Ende für den Computer in dezimal umgewandelt, damit wir es direkt verwenden eine Zahl, die einen Zustand darstellt)

Wir sehen zuerst den Datensatz
1 1 2

0 0 0 0 0 Anfangszustand
Danach nehmen wir das E, verschieben 1-1 Bits nach links und führen dann
die ODER-Operation durch, sodass wir
0 0 0 0 1 erhalten

Auf eine weitere 1
oder
0 0 0 0 1
folgt eine 2-Linksverschiebung um 2-1 Einheiten und dann eine bitweise Operation

0 0 0 1 1

Also repräsentiert 3 den Zustand von 1 1 2.

Bit-Operationen sind also immer noch sehr clever.
Wenn ich den Blue Bridge Cup spielen möchte, ist es meiner Meinung nach immer noch sehr wahrscheinlich, diese Art der Standkomprimierung zu spielen.Der Stand wird komprimiert und dann auf einen Rucksack gelegt.

Bezüglich des Rucksackproblems bin ich auch gerade dabei zusammenzufassen, da es viele Probleme gibt, das erste ist das Suchproblem, im Grunde denken wir direkt DFS, BFS an nichts anderes, höchstens an zwei Punkte. Wenn es ein dp-Problem ist, was ist das wertvollste Problem, im Grunde dp, und dann gibt es Varianten dieser dp-Probleme, die im Grunde das Rucksackproblem sind. Das meiste, was ich bisher gesehen habe, ist nichts anderes als ein vollständiger Rucksack, eine 0 -1 Tornister, und dann richten wir es wieder ein Modell, und dann machen wir Platzoptimierung, im Grunde das war's. Wie sieht es mit dem Rest aus? Es hängt von der tatsächlichen Situation ab. Natürlich gibt es noch einige mathematische Probleme. Immerhin das Blau Bridge Cup ist ein Algorithmus-Wettbewerb. Es wird noch einige mathematische Probleme geben. Sie müssen etwas Mathematik beherrschen. Theorie, aber im Grunde werde ich aufgeben, wenn ich es sehe, es sei denn, es kann heftig und erschöpfend sein (d. h. Backtracking) (also Meister die drei Hauptpunkte, rekursives Backtracking, Suche (DFS, BFS, Halbierung), dp (acht Rucksackprobleme)) und dann Brush to the death, das ist natürlich nur meine aktuelle Idee.Wenn es einen großen Boss gibt, bitte geben mir einige Ratschläge (Kommentarbereich)
Um ehrlich zu sein, bin ich kein professioneller Kandidat.

Ich denke du magst

Origin blog.csdn.net/FUTEROX/article/details/123482918
Empfohlen
Rangfolge