JavaRush /Java-Blog /Random-DE /Logische Operatoren in Java

Logische Operatoren in Java

Veröffentlicht in der Gruppe Random-DE
Logische Operationen in Java.  Bitweise Operationen in Java - 1

Logische Operationen in Java

Logische Operationen werden mit booleschen Operatoren ausgeführt. Verzeihen Sie die Tautologie, aber genau so sind die Dinge. Grundlegende logische Operationen (in der Programmierung und Mathematik) können auf logische Argumente (Operanden) angewendet werden und können auch zur Bildung komplexerer Ausdrücke verwendet werden, ähnlich wie arithmetische Operationen mit Zahlen. Zum Beispiel der Ausdruck:

(a | b) | (c < 100) & !(true) ^ (q == 5)
ist ein komplexer logischer Ausdruck mit vier Operanden: (a | b), wobei аund bTypvariablen sind boolean (c < 100) (true) (q == 5) . Ein einfacher logischer Ausdruck (a | b)besteht wiederum auch aus zwei Operandenargumenten. Ein logischer Operand ist ein Ausdruck, von dem gesagt werden kann, dass er wahr oder falsch, wahr oder falsch ist . Im Java-Sprachgebrauch ist ein boolescher Operand ein Typausdruck booleanoder ein boolescher Ausdruck, zum Beispiel:
  • (2 < 1)— logischer Operand, sein Wert ist falsch
  • true- ein logischer Operand, dessen Wert offensichtlich wahr ist
  • boolean a- kann auch ein logischer Operand sein, wie Boolean a
  • int a = 2- ist kein logischer Operand , sondern nur eine Typvariableint
  • String a = "true"ist auch kein logischer Operand . Dies ist eine Zeichenfolge mit dem Textwert "true".
Die folgenden logischen Operationen sind in Java verfügbar:
  • Logische Negation , auch NOTInversion genannt. In Java wird dies durch das !Symbol „ “ vor dem Operanden angezeigt. Gilt für einen Operanden.
  • Logisch und , es ist auch ANDeine Konjunktion. Angezeigt durch ein „ &“-Symbol zwischen den beiden Operanden, auf die es angewendet wird.
  • Logisch oder in Java ist es auch - OR, es ist auch Disjunktion. In Java wird dies durch das Symbol „ |“ zwischen zwei Operanden angezeigt.
  • Exklusive oder strenge XORDisjunktion. In Java wird dies durch das Symbol „ ^“ zwischen zwei Operanden angezeigt.
  • Zu den logischen Operatoren in Java gehören das bedingte „or“ mit der Bezeichnung „“ ||sowie das bedingte „and“ “ – &&.
Hinweis: Auch in der mathematischen Logik berücksichtigen sie die Äquivalenzrelation, also Gleichheit. In Java wird der Gleichheitsoperator jedoch==nicht als logischer Operator betrachtet. Aufmerksamkeit! In Java gelten die logischen Operatoren&,|und^auch für ganze Zahlen. In diesem Fall funktionieren sie etwas anders und werden bitweise (oder bitweise) logische Operatoren genannt. Über sie – gegen Ende des Artikels. Schauen wir uns eine Tabelle mit einer kurzen Beschreibung der einzelnen logischen Java-Operatoren an. Im Folgenden werden sie detaillierter beschrieben und Codebeispiele bereitgestellt.
Java-Operator Name Typ Kurzbeschreibung Beispiel
! Logisches „nicht“ (Negation) Einstellig !xbedeutet „nicht x“. Gibt true zurück , wenn der Operand false ist . Gibt false zurück , wenn der Operand true ist . boolean x = true;
Dann
// !x == false
& Logisches UND ( AND, Multiplikation) Binär Gibt true zurück , wenn beide Operanden true sind . a = true;
b = false;
Dann
a & b == false
| Logisches ODER ( OR, Addition) Binär Gibt true zurück , wenn mindestens einer der Operanden true ist . a = true;
b = false;
Dann
a | b == true
^ Logisches Exklusiv-ODER ( XOR) Binär Gibt true zurück , wenn nur einer der Operanden true ist . Gibt false zurück , wenn beide Operanden true oder false sind . Im Wesentlichen wird „true“ zurückgegeben, wenn die Operanden unterschiedlich sind. a = true;
b = false;
Dann
a ^ b == true
&& Bedingtes UND (kurzes logisches UND) Binär Dasselbe wie , &aber wenn der Operand links davon false& ist , gibt dieser Operator false zurück , ohne den zweiten Operanden zu überprüfen.
|| Bedingtes ODER (kurzes logisches ODER) Binär Das Gleiche wie , |aber wenn der Operator auf der linken Seite true ist , gibt der Operator true zurück , ohne den zweiten Operanden zu überprüfen.

Logische Operationen im JavaRush-Kurs

Es gibt kein Entrinnen vor logischen Operationen, und im JavaRush-Kurs tauchen sie ab den ersten Ebenen auf, zusammen mit Bedingungen und dem booleschen Datentyp. Programmierer lernen nach und nach, die Methoden der mathematischen Logik anzuwenden. Für einen sichereren Umgang mit logischen Konstruktionen sind eine gewisse Geschicklichkeit und das Verständnis bestimmter Prozesse erforderlich. Daher werden diese Operationen am Ende der Multithreading-Quest detaillierter und auf einer völlig anderen Ebene angegangen, wenn die meisten Schüler nicht mehr direkt von der Syntax und den Konstruktionen abgelenkt werden, sondern versuchen, sich mit dem Kern der Aufgabe zu befassen.

Logische Operationen in Java.  Bitweise Operationen in Java - 2

Logischer Negationsoperator !

Dieser Operator ist unär, d. h. er gilt für einen einzelnen booleschen Ausdruck oder Operanden. Es ist wie jede Negation sehr einfach zu verstehen: Der Operator ändert einfach die Bedeutung des Ausdrucks in sein Gegenteil. Wahrheitstabelle oder Ergebnisse der Durchführung einer Negationsoperation:
Der Wert von a !A
FALSCH WAHR
WAHR FALSCH
Beispiel. Logische Negationsoperation
public class Solution {
   public static void main(String[] args) {
       boolean a = true;
       System.out.println(!a); // hier kehrt unser boolescher Ausdruck seinen Wert um
       System.out.println(!false); // Ein nicht falscher Ausdruck ist, wie Sie vielleicht vermuten, gleich... was?
       System.out.println(!(2 < 5)); // Ausdruck (2 < 5) ist wahr, daher ist seine Negation falsch

   }
}
Die Ausgabe des Programms wird wie folgt sein:

false
true
false

Logisches UND - & sowie bedingtes UND - &&

Ein logisches UND oder eine Verknüpfung wird auf zwei Ausdrücke angewendet und das Ergebnis ist nur dann wahr , wenn beide Operanden wahr sind. Das heißt, wenn einer der Operanden aoder den Wert falseb hat , ist der Ausdruck unabhängig vom Wert des zweiten Operators falsch . Wenn Sie sich vorstellen, dass wahr die Zahl 1 und falsch 0 ist, dann funktioniert der Operator genauso wie die reguläre Multiplikation. Daher wird logisches UND oft als „logische Multiplikation“ bezeichnet. Und übrigens hilft diese Tatsache dabei, sich schnell an die Bedienung des Operators zu erinnern und sie nicht mit dem logischen Operator oder zu verwechseln . Wahrheitstabelle UND, es ist auch das Ergebnis der Arbeit des Bedienersa & b&&|&
A B a&b
WAHR WAHR WAHR
WAHR FALSCH FALSCH
FALSCH WAHR FALSCH
FALSCH FALSCH FALSCH
Logisches UND, es ist auch eine Konjunktion, Beispiele:
public class Solution {
   public static void main(String[] args) {
       boolean a = true;
       boolean b = false;
       boolean c = true;
       System.out.println(a & b); // wenn wir wahr mit falsch multiplizieren, erhalten wir definitiv falsch
       System.out.println(a & c); // wahr zu wahr wird wahr sein
       System.out.println(false & (2 > 5));
 System.out.println((2 < 5) & false);
 // unabhängig von der Wahrhaftigkeit des Ausdrucks in Klammern, in diesem Fall müssen wir uns mit false begnügen
   }
}
Ergebnis des Programms:

false
true
false
false
Der Operator &&wird manchmal „kurzes UND“ genannt. Er führt bei der Arbeit mit logischen Operanden zum gleichen Ergebnis wie der Operator &. Es gibt jedoch einen Unterschied in seiner Arbeit selbst. Sie haben also bereits bemerkt, dass es keinen Sinn macht, den Wert des Operanden zu überprüfen, wenn a & bder Operand im Ausdruck () falsea ist : Das Ergebnis der Operation wird definitiv false sein . Wenn wir also den Wert des zweiten Operanden nicht grundsätzlich benötigen, reduzieren wir durch dessen Verwendung die Anzahl der Berechnungen im Programm. Wenn wir alle Operatoren im Beispiel durch ersetzen , ist das Ergebnis genau das gleiche, aber das Programm selbst läuft etwas schneller (obwohl wir das nicht bemerken werden, da es sich um Mili-Micro handelt ... kurz gesagt). , sehr kleine Zeiteinheiten). b&&&&&

Logisches ODER ist der Operator |, und bedingtes ODER ist der Operator ||

Der ODER-Operator in Java wird durch das Symbol dargestellt |. Ein logisches ODER oder eine Disjunktion wird auf zwei Ausdrücke angewendet und sein Ergebnis ist genau dann falsch , wenn beide Operanden falsch sind. Hier beobachten wir gewissermaßen das gleiche Bild wie beim Operator &, aber genau das Gegenteil. Das heißt, wenn mindestens ein Operand wahr ist , ist der Ausdruck a | bgarantiert wahr, unabhängig vom Wert des zweiten Operators. Wenn &es sich wie eine logische Multiplikation verhält, dann ist ODER eine logische Addition, wenn Sie sich vorstellen, dass „wahr “ 1 und „falsch “ 0 ist. Denken Sie daran, dass die logische Addition anders funktioniert als die normale Addition. 1 + 1 ist in diesem Fall nicht gleich 2, sondern 1 (die Zahl 2 existiert in diesem System einfach nicht). Manchmal wird unter Disjunktion das Maximum von 0 und 1 verstanden, und in diesem Fall erhalten wir genau true , wenn mindestens ein Operand gleich 1 ( true ) ist . ODER-Wahrheitstabelle, auch als Ergebnis des Operators bekannt : |
A B ein | B
WAHR WAHR WAHR
WAHR FALSCH WAHR
FALSCH WAHR WAHR
FALSCH FALSCH FALSCH
Logisches ODER, auch Disjunktion genannt, Beispiel:
public class Solution {
   public static void main(String[] args) {
       boolean a = true;
       boolean b = false;
       boolean c = true;
       System.out.println(!a | b); // Verfassen Sie die Verwendung von zwei logischen Operatoren: a == true, also ist !a, wie wir bereits wissen, falsch.
       System.out.println(a | c);
       System.out.println((2 < 5) | false); // Ausdruck (2 < 5) ist wahr, was bedeutet, dass wir für jeden zweiten Operanden ein wahres Ergebnis erhalten
       System.out.println((2 > 5) | true);

   }
}
Ergebnis:

false
true
true
true
Wenn wir den bedingten ODER-Operator ||anstelle von verwenden |, erhalten wir genau das gleiche Ergebnis, aber wie im Fall des bedingten UND &&verhält es sich wirtschaftlich: Wenn wir auf den ersten Operanden „stoßen“, der gleich „ true“ ist , ist der Wert von der zweite Operand wird nicht überprüft, aber das Ergebnis ist sofort wahr .

XOR Java – Logischer Exklusiv-ODER-Operator ^

XOR, Modulo-2-Addition, logisches XOR, logische Subtraktion, strikte Disjunktion, bitweises Komplement ... der Operator ^hat in der Booleschen Algebra viele Namen. Das Ergebnis der Anwendung dieses Operators auf zwei Operanden ist wahr , wenn die Operanden unterschiedlich sind, und falsch, wenn die Operanden gleich sind. Daher ist es praktisch, es mit der Subtraktion von Nullen ( false ) und Einsen ( true ) zu vergleichen . Wahrheitstabelle XOR, auch als Ergebnis des Operators bekannt ^:
Boolescher Wert a Boolescher b a^b
WAHR WAHR FALSCH
WAHR FALSCH WAHR
FALSCH WAHR WAHR
FALSCH FALSCH FALSCH
Beispiel:
public class Solution {
   public static void main(String[] args) {
       boolean a = true;
       boolean b = false;
       boolean c = true;
       System.out.println(!a ^ b); // Verfassen Sie die Verwendung von zwei logischen Operatoren: a == true, also ist !a, wie wir bereits wissen, falsch.
       System.out.println(a ^ c);
       System.out.println((2 < 5) ^ false);
       System.out.println((2 > 5) ^ true);
   }
}
Ergebnis:

false
false
true
true

Priorität logischer Operationen

Genau wie in der Mathematik haben Operatoren in der Programmierung eine bestimmte Ausführungsreihenfolge, wenn sie im selben Ausdruck vorkommen. Unäre Operatoren haben Vorteile gegenüber binären Operatoren und Multiplikation (sogar logische) gegenüber Addition. Wir haben logische Operatoren in der Liste umso höher eingestuft, je höher ihre Priorität ist:
  1. !
  2. &
  3. ^
  4. |
  5. &&
  6. ||
Schauen wir uns Beispiele an. Konjunktion und Disjunktion ( &und |) haben unterschiedliche Prioritäten:
public class Solution {
   public static void main(String[] args) {
       boolean a = true, b = true, c = false;
       System.out.println(a | b & c);
}
Wenn wir von links nach rechts vorgehen würden, also zuerst den Operator |und dann - anwenden würden &, würden wir den Wert false erhalten . Wenn Sie dieses Programm jedoch ausführen, können Sie sicher sein, dass die Ausgabe wahr ist , da der logische UND-Operator &eine höhere Priorität hat als der logische ODER-Operator |. Um Verwirrung zu vermeiden, müssen Sie bedenken, dass sich das, was &sich wie eine Multiplikation verhält, und |das, was sich wie eine Addition verhält. Sie können die Prioritätsreihenfolge ändern. Verwenden Sie einfach Klammern, genau wie in der Schulmathematik. Lassen Sie uns unseren Beispielcode ein wenig ändern:
public class Solution {
   public static void main(String[] args) {
       boolean a = true, b = true, c = false;
       System.out.println((a|b)&c);
}
Was ist los? Zuerst verwenden wir die logische Addition in Klammern und dann die Multiplikation. Das Ergebnis wird falsch sein .

Komplexe logische Ausdrücke

Natürlich können wir boolesche Ausdrücke und Operatoren kombinieren. Erinnern wir uns an den Ausdruck vom Anfang des Artikels:
(a | b) | (c < 100) & !(true) ^ (q == 5)
Jetzt sieht es nicht mehr so ​​gruselig aus. Schreiben wir ein Programm, das seinen Wert anzeigt, nachdem wir zuvor die Werte von , aund bestimmt haben . Beispiel für die Berechnung des Werts eines komplexen booleschen Ausdrucks bсq
public class Solution {
   public static void main(String[] args) {
       boolean a = true;
       boolean b = false;
       int c = 25;
       int q = 2;
       System.out.println((a|b) | (c < 100) & !(true)^(q == 5));
   }
}
Beachten Sie:qUnsere Variable ist vom Typ int, aber q == 5dies ist ein boolescher Ausdruck und gleich false , da wir oben mit qder Zahl 2 initialisiert haben. Das Gleiche gilt für die Variable c. Diese Zahl ist gleich 25, aber (c < 100) ist ein boolescher Ausdruck gleich true . Das Ergebnis dieses Programms:

true
Komplexe boolesche Ausdrücke können zum Testen sehr komplexer und verzweigter Bedingungen verwendet werden, sie sollten jedoch nicht überbeansprucht werden, da sie die Lesbarkeit des Codes erschweren.

Bitweise (bitweise) Operatoren

Am Anfang des Artikels haben wir erwähnt, dass die Operatoren &, |und ^in Bezug auf Java-Ganzzahltypen verwendet werden können. In diesem Fall handelt es sich um bitweise Operatoren. Sie werden auch bitweise genannt, da eine Ziffer ein Bit ist und diese Operationen speziell mit Bits funktionieren. Natürlich funktionieren sie etwas anders als logische Operatoren, und um genau zu verstehen, wie, müssen Sie wissen, was ein binäres Zahlensystem ist. Wenn Sie nichts darüber wissen oder es völlig vergessen haben, empfehlen wir Ihnen, zuerst den Artikel Java: Bits und Bytes zu lesen und alle anderen daran zu erinnern, dass es im binären Zahlensystem nur zwei Ziffern gibt – 0 und 1 – und alle Daten im Computer wird durch die Verwendung bedingter Nullen und Einsen präzise dargestellt. Alle Zahlen, die wir gewohnt sind (dezimal; für sie gibt es 10 verschiedene Ziffern von 0 bis 9, mit denen wir beliebige Zahlen schreiben), können im binären Zahlensystem dargestellt werden. Sie können eine Dezimalzahl in eine Binärzahl umwandeln, indem Sie die sequentielle Division in eine Spalte mithilfe des Zahlensystems Basis (2) verwenden. Die Reste der Division bei jedem Schritt, in umgekehrter Reihenfolge geschrieben, ergeben die gewünschte Binärzahl. Hier zum Beispiel die Umwandlung der Dezimalzahl 103 in die binäre Darstellung: Logische Operationen in Java.  Bitweise Operationen in Java - 3

Binäres Zahlensystem im JavaRush-Kurs

Im JavaRush-Kurs sprechen sie während des Studiums der MultiThreading-Quest (Stufe 10, Vorlesung 1) über das binäre Zahlensystem; nach der Vorlesung gibt es mehrere Aufgaben zur Vertiefung. Dieses Thema ist jedoch überhaupt nicht schwierig, und selbst wenn Sie im Kurs noch nicht so weit gekommen sind, werden Sie es wahrscheinlich herausfinden.

Zusätzlich zu &, |und ^verwendet Java auch bitweise Operatoren:
  • ~ bitweiser Negationsoperator
  • >>bitweise nach rechts verschieben
  • >>>Bitweise Rechtsverschiebung ohne Vorzeichen
  • <<bitweise Verschiebung nach links
Auf Anfänger wirken bitweise Operatoren sehr verwirrend und künstlich. Sie verstehen meist nicht, wofür sie gebraucht werden, außer zur Lösung von Bildungsproblemen. Tatsächlich können sie zumindest zum Organisieren einer effizienten Division und Multiplikation verwendet werden, und Profis verwenden sie zum Kodieren/Dekodieren, Verschlüsseln und Erzeugen von Zufallszahlen.

Bitweise Operatoren &, | und ^

Schauen wir uns ein Beispiel für die Funktionsweise dieser Operatoren an. Nehmen wir an, wir haben zwei ganze Zahlen:
int a = 25;
int b = 112; 
Wir müssen drei Operationen auf sie anwenden und &das Ergebnis auf dem Bildschirm anzeigen. Hier ist der Programmcode: |^
public class Solution {
   public static void main(String[] args) {

       int a = 25;
       int b = 112;

       int res1 = a & b;
       int res2 = a | b;
       int res3 = a ^ b;

       System.out.println("a & b = " + res1);
       System.out.println("a | b = " + res2);
       System.out.println("a ^ b = " + res3);

   }
}
Das Ergebnis des Programms ist wie folgt:

a & b = 16
a | b = 121
a ^ b = 105
Wenn man nicht versteht, was passiert, sieht das Ergebnis sehr, sehr mysteriös aus. Tatsächlich ist alles einfacher als es scheint. Bitweise Operatoren „sehen“ die Operandennummern in ihrer binären Form. Und dann wenden sie logische Operatoren an oder &auf die entsprechenden Ziffern (Bits) beider Zahlen. Denn das letzte Bit der binären Darstellung der Zahl 25 addiert sich logischerweise zum letzten Bit der binären Darstellung der Zahl 112, das vorletzte Bit mit der vorletzten Eins und so weiter: Die gleiche Logik lässt sich in der verfolgen Fall von und . |^&Logische Operationen in Java.  Bitweise Operationen in Java - 4|^Logische Operationen in Java.  Bitweise Operationen in Java - 5

Bitverschiebung nach links oder rechts

In Java gibt es mehrere Bitverschiebungsoperatoren. Die am häufigsten verwendeten Operatoren <<sind und >>. Sie verschieben die binäre Darstellung einer Zahl nach links bzw. rechts und im Falle einer Verschiebung nach rechts unter Beibehaltung des Vorzeichens (was die Beibehaltung des Vorzeichens bedeutet, erklären wir weiter unten). Es gibt einen weiteren Rechtsverschiebungsoperator >>>. Es macht das Gleiche, >>speichert das Zeichen aber nicht. Schauen wir uns ihre Arbeit also anhand eines Beispiels an. int a = 13 a << 1verschiebt alle Bits der binären Darstellung der Zahl a um 1 Bit nach links. Stellen wir uns zur Vereinfachung die Zahl 13 im Binärformat als 0000 1101 vor. Tatsächlich sieht diese Zahl so aus: 00000000 00000000 00000000 00001101, da Java int4 Bytes oder 32 Bits für Zahlen zuweist. Da dies im Beispiel jedoch keine Rolle spielt, gehen wir in diesem Beispiel davon aus, dass unsere Zahl ein Byte groß ist. Logische Operationen in Java.  Bitweise Operationen in Java - 6Das rechts frei gewordene Bit wird mit Nullen aufgefüllt. Als Ergebnis dieser Operation erhalten wir die Zahl 26. a << 2Sie verschiebt alle Bits der binären Darstellung der Zahl aum 2 Bits nach links und die beiden frei gewordenen Bits rechts werden mit Nullen aufgefüllt. Als Ergebnis erhalten wir die Zahl 52. a << 3Das Ergebnis wird 104 sein... Ist Ihnen das Muster aufgefallen? Das bitweise Verschieben aum n Positionen nach links funktioniert wie das Multiplizieren einer Zahl amit 2 hoch n. Dasselbe gilt auch für negative Zahlen. Dies -13 << 3ergibt das Ergebnis -104. a >> nverschiebt die binäre Darstellung einer Zahl um n Positionen nach rechts. Wandelt beispielsweise 13 >> 1 die Zahl 1101 in die Zahl 0110, also 6, um. 13 >> 2Das Ergebnis ist 3. Das heißt im Wesentlichen, dass wir hier die Zahl durch 2 hoch n dividieren, wobei n die Anzahl der Verschiebungen ist nach rechts, aber mit einer Einschränkung: Wenn die Zahl ungerade ist, scheinen wir bei diesem Vorgang das letzte Bit der Zahl zurückzusetzen. Bei negativen ist die Situation jedoch etwas anders. Versuchen Sie beispielsweise zu überprüfen, was das Programm erzeugt, wenn Sie es auffordern, eine Operation auszuführen -13 >> 1. Sie sehen die Zahl -7 und nicht -6, wie Sie vielleicht denken. Dies liegt an der Art und Weise, wie negative Zahlen in Java und anderen Programmiersprachen gespeichert werden. Sie werden im sogenannten Komplementärcode gespeichert. In diesem Fall wird unter dem Vorzeichen die höchstwertige Ziffer (die linke) angegeben. Bei einer negativen Zahl ist die höchstwertige Ziffer 1.

Zusätzlicher Code

Betrachten wir die Zahl int a = 13. Wenn Sie im Programm seine binäre Darstellung mit dem Befehl an die Konsole ausgeben System.out.println(Integer.toBinaryString(a));, erhalten wir 1101. Tatsächlich handelt es sich hierbei um eine Kurzschreibweise, da die Typnummer int4 Bytes im Speicher einnimmt, sodass der Computer sie mehr „sieht“. so was:

00000000 00000000 00000000 00001101
Die höchstwertige Ziffer ist Null, was bedeutet, dass wir eine positive Zahl haben. So übersetzen Sie in zusätzlichen Code:
  1. Wir schreiben die Zahl -13 im sogenannten „Direktcode“. Ändern Sie dazu die höchstwertige Ziffer der Zahl auf 1.
    Ergebnis der Aktion:

    
    10000000 0000000 0000000 00001101
  2. Als nächstes invertieren wir alle Bits (wir ändern 0 in 1 und 1 in 0), mit Ausnahme des Vorzeichenbits. Tatsächlich haben wir es bereits geändert.
    Ergebnis der Aktion:

    
    11111111 11111111 11111111 11110010

    (Ja, die Schritte 1 und 2 könnten kombiniert werden, aber es ist besser, es so zu betrachten)

  3. Addiere 1 zur resultierenden Zahl.
    Ergebnis der Aktion:

    
    11111111 11111111 11111111 11110011
Die resultierende Binärzahl ist -13, geschrieben im Zweierkomplementcode, und die Bitverschiebung (und andere Operationen) werden speziell auf sie angewendet. Es ist nur so, dass der Unterschied in der Betriebslogik nicht bei allen Vorgängen spürbar ist. Nehmen wir an, bei derselben Verschiebung nach links ist der Unterschied nicht wahrnehmbar; wir können mit negativen Zahlen genauso arbeiten wie mit positiven Zahlen. Gehen wir nun nach rechts -13 >> 1. Da unser Operator >>das Vorzeichen beibehält, werden bei dieser Operation alle links freigegebenen Bits nicht mit Nullen, sondern mit Einsen aufgefüllt. Dadurch wird die Zahl verschoben

11111111 11111111 11111111 11110011
ein Bit nach rechts, was zu folgender Bitfolge führt:

11111111 11111111 11111111 11111001
Wenn wir diese Zahl in direkten Code umwandeln (d. h. zuerst 1 subtrahieren und dann alle Bits außer dem ersten invertieren), erhalten wir die Zahl:

10000000 00000000 00000000 00000111
oder -7. Nachdem wir nun den vorzeichenerhaltenden Rechtsverschiebungsoperator verstanden haben, wird klar, wie er sich vom Operator unterscheidet >>>. a >>> n— Bei dieser Operation handelt es sich um eine vorzeichenlose Verschiebung, das heißt, sie verschiebt die binäre Darstellung einer Zahl aum n Bits nach rechts, füllt aber die links frei gewordenen n Bits nicht mit Einsen wie der Operator >>, sondern mit Nullen. Lassen Sie uns die Operation durchführen -13 >>> 1. Wir haben bereits die Zahl -13im Zweierkomplement:

11111111 11111111 11111111 11110011
Durch Verschiebung um 1 Bit nach rechts und Auffüllen des freien Bits mit Null erhalten wir folgende Zahl:

01111111 11111111 11111111 11111001
Was gibt die Zahl in Dezimalschreibweise an 2147483641?

Bitweiser Negationsoperator ~

Dieser unäre Operator funktioniert sehr einfach: Er kehrt jedes Bit der binären Darstellung einer ganzen Zahl um. Nehmen wir die Zahl -13:

11111111 11111111 11111111 11110011
Die bitweise Negationsoperation ~13kehrt einfach den Wert jedes Bits um. Als Ergebnis erhalten wir:

00000000 00000000 00000000 00001100
Oder 12in Dezimalform.

Kurze Schlussfolgerungen

  • Alle logischen Operatoren gelten für boolesche Ausdrücke, also solche, von denen man sagen kann, dass sie wahr oder falsch sind .
  • Если операторы &, | oder ^ применяются к числам, речь идёт уже не о логических операциях, а о побитовых. То есть оба числа переводятся в двоичную систему и к этим числам побитово применяют операции логического сложения, умножения oder вычитания.
  • В математической логике операторам & и | соответствуют конъюнкция и дизъюнкция.
  • Логическое И похоже на умножения 1 (true) и 0 (false).
  • Логическое ИЛИ напоминает поиск максимума среди 1 (true) и 0 (false).
  • Для побитового отрицания целого числа a используется операция ~a.
  • Для логического отрицания булевского выражения a используется операция !a.
  • Отрицательные числа хранятся и обрабатываются в дополнительном Codeе.
  • Поразрядный сдвиг вправо может сохранять знак (>>), а может — не сохранять (>>>).
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION