Operator |

beastofchaos

Bekanntes Mitglied
Hallo Leute,
Ich habe eine Frage. Wie funktioniert eigentlich der Operator "|".
Denn in mehreren Fällen lassen sich dadurch zwei int-Variablen verbinden und nachher wieder trennen (zum Beispiel beim Font-Style: "Font.ITALIC | Font.BOLD").

Habe mal folgenden Code zum Verstehen eingetippt und ausgefüht:
Java:
		System.out.println((1 | 100) + " - " + (100 | 1));
		System.out.println((2 | 100) + " - " + (100 | 2));
		System.out.println((5 | 100) + " - " + (100 | 5));
		System.out.println((10 | 100) + " - " + (100 | 10));
		System.out.println((20 | 100) + " - " + (100 | 20));
		System.out.println((50 | 100) + " - " + (100 | 50));
		System.out.println((100 | 100) + " - " + (100 | 100));

Konsolen-Ausgabe:
HTML:
101 - 101
102 - 102
101 - 101
110 - 110
116 - 116
118 - 118
100 - 100

Was genau passiert da, das z.B. "1 | 100" das gleiche wie "5 | 100" ist?
Gruß, Thomas
 

njans

Top Contributor
| ist der bitweise Oder-Operator:

Wenn du 1 und 100 oderst, dann erhälst du eben aus:
...01100100 (100) und
...00000001 (1)folgt
...01100101 (als Zahl 101)

Oder ist eben genau das, was logisch die Bits der Eingaben nimmt und jedes Bit auf ein resultierendes Bit abbildet:

x y r
0 0 0
1 0 1
0 1 1
1 1 1
 
Zuletzt bearbeitet:
N

nillehammer

Gast
Der Operator ist das bitweise ODER. Dabei werden alle bits der Verknüpften Variablen mit ODER verknüpft. Dein erstes Beispiel:
Code:
100 in bits: 1100100
1 in bits:     0000001
mit oder:    11001001
Zahl: 101
Oft will man sog. flags speichern, z.B. Bold (oder nicht), Italic (oder nicht), Unterstrichen (oder nicht). Da könnte man jetzt jeweils eigene Boolean variablen nehmen, oder man packt alles in eine numerische Variable und sagt: Das höchte Bit ist Bold, das zweithöchste ist italic etc. Dann die entsprechenden Zahlkonstanten definieren und mit oder schaltet man das gewünschte Feature an. Stichwort dazu ist: Bitmaske
 
Zuletzt bearbeitet von einem Moderator:

beastofchaos

Bekanntes Mitglied
Ah verstehe und daraus kann man dann auch wieder ablesen, ob das darin vorkommt.

Wenn ich jetzt "100 | 5" schreiben würde, käme raus:

+ 1100100 (= 100)
+ 0000101 (= 5)
= 1100101 (= 101)

Das wäre also auch das selbe wir bei "100 | 1". Es ist wohl am besten für seine Konstanten, die man verbinden will, einfach die simpelsten binären zu nehmen, oder?

konst a = 1
konst b = 2
konst c = 4
konst d = 8
usw.

Damit keine Verwechslung entstehen kann, richtig? :)
 

njans

Top Contributor
Sofern deine Konstanten immer 2^n entsprechen, ja. Nur so gibt es eben sicher keine überschneidungen. Bit Operation kann man auch wunderbar machen um viele Daten in eine Zahl zu quetschen. Mithilfe von ODER, UND und bit shifts kann man dann diese Daten wieder extrahieren
 

beastofchaos

Bekanntes Mitglied
Super Sache. Wieder was gelernt :)

Nur eine Frage, wie les ich das dann wieder aus?
In Font() sieht das so aus:
Code:
this.style = (style & ~0x03) == 0 ? style : 0;

Aber ich versteh diese Operation noch nicht. Wer erklär-faul ist, kann mir auch gerne ein Stichwort geben, dann such ichs mir selber per Google raus.

Gruß, Thomas
 

beastofchaos

Bekanntes Mitglied
Ah okay! In der Methode "getAttrobuteValues()" steht das dann so in der Abfrage:
Code:
if ((style & BOLD) != 0){} // -> BOLD

Und das versteh ich auch :) Bloß, was bedeutet die Abfrage im Konstruktor?

Gruß, Thomas
 

njans

Top Contributor
Java:
this.style = (style & ~0x03) == 0 ? style : 0;

0x03 ist hexadezimal und sollte 3 sein. Also bitweise ...011. Das ~ ist der Negator (NOT), der macht aus ...000011 eben ...111100. Das ganze wird geodert, also es bleiben nur die 1 stehen, bei denen beide ints jeweils 1 sind.
Du bekommst also die Bits aus style, die eben nicht an erster und 2ter Stelle stehen (eben nicht drei). Und dann wird geguckt, ob diese Zahl eben 0 ist.
Generell schaust du, ob ein bit, außer den ersten beiden, nicht null ist.
 

beastofchaos

Bekanntes Mitglied
Aus welchem Grund wird da denn eine Hexadezimalzahl benutzt? Theoretisch würde es doch genauso einfach dezimal mit "3" funktionieren, oder?

Und dann nur ne Frage nach Bestätigung:
Wenn ich eine solche Zahl abfragen will, ob sie eine, der beiden anderen ist, sollte es doch damit funktionieren, oder?

Java:
/// true, wenn die Zahlen a und/oder b beinhaltet
public boolean check(int i){
    int a = 1;
    int b = 2;
    return ((s & (a | b)) != 0);
}

Gruß, Thomas
 
Zuletzt bearbeitet:

njans

Top Contributor
Hexadezimal wird oft verwendet, da man da (angeblich) besser ansehen kann, welche Bits belegt sind. Geht mir persönlich nicht so, aber ich habe auch noch nicht sonderlich viel mit Bitoperationen in Java gearbeitet.

Ja, deine Methode prüft ob a und/oder b enthalten sind.
 

Landei

Top Contributor
Ab Java 7 kannst du sogar die binäre Schreibweise benutzen (startet mit 0b ). Aber die Bitbelegung sieht man auch in hexadezimal ganz gut, man muss halt nur die Muster für die 16 Hex-Ziffern kennen.
 
S

Spacerat

Gast
[OT]
Hexadezimal wird oft verwendet, da man da (angeblich) besser ansehen kann, welche Bits belegt sind. Geht mir persönlich nicht so, aber ich habe auch noch nicht sonderlich viel mit Bitoperationen in Java gearbeitet.

Ist aber eindeutig was dran, dass man's bei Hexzahlen besser erkennt. Was Landei da anbringt, ist nur reine Übungssache. Das liegt daran, dass die Basis 16 im Gegensatz zur Basis 10 eine glatte "powerOfTwo"-Zahl ist. Daraus folgt, dass die Anzahl der Stellen bei Hex und Bin stets gleichzeitig erweitert. Z.B. kommt bei einem Sprung von 15 auf 16 bei Hex und Bin jeweils eine Stelle hinzu, bei Dez jedoch nicht. Lohnt sich auf jeden Fall, sich das anzugewöhnen.[/OT]
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
pkelod Binäre Darstellung Bitwise-Operator Java Basics - Anfänger-Themen 10
U Wie genau funktioniert der ! Operator Java Basics - Anfänger-Themen 3
C ?: Operator Java Basics - Anfänger-Themen 14
L Java operator % Java Basics - Anfänger-Themen 3
KogoroMori21 Erklärung zum Ternären Operator Java Basics - Anfänger-Themen 4
B Modulo-Operator anhand eines Beispieles erklären Java Basics - Anfänger-Themen 7
C Ternärer Operator mit Strings Java Basics - Anfänger-Themen 3
L Modulus Operator Java Basics - Anfänger-Themen 3
A Zuweisungen und -- operator; Java Basics - Anfänger-Themen 2
H << Operator Java Basics - Anfänger-Themen 7
F RegEx "+" nur als Zeichen, nicht als Operator oder Sonstiges Java Basics - Anfänger-Themen 2
H Operatoren Der bedingte Operator ? : ; Java Basics - Anfänger-Themen 2
J new-Operator Java Basics - Anfänger-Themen 6
H this operator - was ist das? Java Basics - Anfänger-Themen 2
R Operatoren Bad operand types for binary operator Java Basics - Anfänger-Themen 4
O Bedingter Operator eine Frage! Java Basics - Anfänger-Themen 10
O Erste Schritte x*y*z mit Shift Operator moeglich? Java Basics - Anfänger-Themen 15
L Operatoren error: bad operand types for binary operator && Java Basics - Anfänger-Themen 8
E Methoden in new-Operator Methode in geschweifter Klammer Java Basics - Anfänger-Themen 3
I bad operand types for binary operator > Java Basics - Anfänger-Themen 5
D Conditional Operator ?: Java Basics - Anfänger-Themen 3
L Operatoren Übungsklausuraufgabe, unbekannter Operator Java Basics - Anfänger-Themen 13
H Operatoren Fehler bad operand types for binary operator Java Basics - Anfänger-Themen 7
snipesss Operator "-" is undefined Java Basics - Anfänger-Themen 1
F Operatoren If mit variabelem Operator Java Basics - Anfänger-Themen 2
J instanceof Operator Java Basics - Anfänger-Themen 3
K Operatoren The Operator * is undefined for the argument type(s) double, String Java Basics - Anfänger-Themen 4
J Operator * benutzen Java Basics - Anfänger-Themen 3
DeVolt Operatoren Frage zum new-Operator Java Basics - Anfänger-Themen 4
N Methoden Modulo Operator Java Basics - Anfänger-Themen 1
S Operatoren ! Operator Java Basics - Anfänger-Themen 4
O Operator undefined Java Basics - Anfänger-Themen 2
N this-Operator Java Basics - Anfänger-Themen 2
ubaro1 Operatoren Der Tide Operator und positive Ganzzahlen in Binär Java Basics - Anfänger-Themen 1
S Hashcode - Operator ^ Java Basics - Anfänger-Themen 11
M Shift Operator Java Basics - Anfänger-Themen 3
V XOR-Operator? Java Basics - Anfänger-Themen 5
K Zugriff einer Klasse auf eine andere Andere -> bad operand for binary operator Java Basics - Anfänger-Themen 5
J bad operand types for binary operator Java Basics - Anfänger-Themen 3
T Pixelmanipulation Sobel-Operator Java Basics - Anfänger-Themen 2
K Frage zu Class Operator Java Basics - Anfänger-Themen 2
L The operator && is undefined for the argument type(s) String, boolean Java Basics - Anfänger-Themen 8
C Operatoren | - Operator Java Basics - Anfänger-Themen 10
K .Class Operator unklar Java Basics - Anfänger-Themen 3
R Compiler-Fehler Operator + nicht erlaubt? Java Basics - Anfänger-Themen 6
C Was tut der | Operator? Java Basics - Anfänger-Themen 8
K Polymorphie und instanceOf Operator Java Basics - Anfänger-Themen 6
S Objekt Erzeugung ohne new Operator Java Basics - Anfänger-Themen 6
C Logischer UND Operator funktioniert nicht richtig Java Basics - Anfänger-Themen 5
H Buch: Java lernen mit BlueJ Modulo-Operator Java Basics - Anfänger-Themen 16
K Conditional Operator Java Basics - Anfänger-Themen 16
A Was bedeutet der Operator *= ? Java Basics - Anfänger-Themen 2
A Operator in Java Java Basics - Anfänger-Themen 11
S Modulo Operator Java Basics - Anfänger-Themen 8
C Variablen Problem: variable operator might not have been initialized Java Basics - Anfänger-Themen 9
D : ? Operator -Verständnisproblem Java Basics - Anfänger-Themen 24
K OOP Wertebereich Ergebnis von % Operator Java Basics - Anfänger-Themen 8
L Frage zu Konstruktoren und dem this Operator Java Basics - Anfänger-Themen 16
R Ersatz für Modulo Operator Java Basics - Anfänger-Themen 8
W &-Operator in diesem Zusammenhang Java Basics - Anfänger-Themen 19
J Oder-Operator Tastenkürzel Java Basics - Anfänger-Themen 7
K Cast-Operator Java Basics - Anfänger-Themen 3
D Bit-Operator & Java Basics - Anfänger-Themen 5
Q mathematische Operationen als Methode und nicht Infix-Operator Java Basics - Anfänger-Themen 14
V Cast-Operator Java Basics - Anfänger-Themen 2
G super operator und incompatible types, simple fehler Java Basics - Anfänger-Themen 8
N Operator aus Array lesen Java Basics - Anfänger-Themen 2
G Für was braucht man den This-operator Java Basics - Anfänger-Themen 3
M Binärdarstellung in Java mit Shift-Operator + bitweises und Java Basics - Anfänger-Themen 2
W Seltsamer Operator int var = 1<< 23; Java Basics - Anfänger-Themen 4
P If Abfrage, Variablenvertauschung und UND Operator Java Basics - Anfänger-Themen 4
J Modulo-Operator rechnet falsch Java Basics - Anfänger-Themen 2
B + operator Java Basics - Anfänger-Themen 4
F Generische Methode - was bringt der Wildcard Operator? Java Basics - Anfänger-Themen 7
H Konditional Operator Java Basics - Anfänger-Themen 2
NightmareVirus new operator Java Basics - Anfänger-Themen 5
M %-Operator Java Basics - Anfänger-Themen 3
G string ohne '+' operator Java Basics - Anfänger-Themen 5
S Modulo-Operator Java Basics - Anfänger-Themen 5
S Operator ! auf char nicht anwendbar, was nun? Java Basics - Anfänger-Themen 7
T sobel-operator Java Basics - Anfänger-Themen 3
W %-Operator Java Basics - Anfänger-Themen 4
S Unterschied: ++a & a++ Operator? Java Basics - Anfänger-Themen 9
ven000m Operator += Java Basics - Anfänger-Themen 4
Student Probleme mit dem new-Operator Java Basics - Anfänger-Themen 14
G Operator-Überladung Java Basics - Anfänger-Themen 6
B Operator Java Basics - Anfänger-Themen 2
Z operator ++ Java Basics - Anfänger-Themen 3
N return-Operator Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben