int-Werte mit & verknüpfen

Hey.
Ich habe sowas schon paar mal gesehen, in Google finde ich dazu jedoch nichts, und auch die Ergebnisse lassen mich auch nicht darauf schließen, was da jetzt passiert:

        int i = 5, j = 30;
        int ergebnis = i & j;
        System.out.println(i + " & " + j + " = " + ergebnis);
        ergebnis = i | j;
        System.out.println(i + " | " + j + " = " + ergebnis);
        ergebnis = 5 & 20;
        System.out.println("5 & 20 = " + ergebnis);
        ergebnis = 5 | 20;
        System.out.println("5 | 20 = " + ergebnis);
        ergebnis = 4 & 12;
        System.out.println("4 & 12 = " + ergebnis);
        ergebnis = 4 | 12;
        System.out.println("4 | 12 = " + ergebnis);
        ergebnis = 4 & 4;
        System.out.println("4 & 4  = " + ergebnis);
        ergebnis = 4 | 4;
        System.out.println("4 | 4  = " + ergebnis);
        ergebnis = 8 & 4;
        System.out.println("8 & 4  = " + ergebnis);
        ergebnis = 8 | 4;
        System.out.println("8 | 4  = " + ergebnis);
    }```
```5 & 30 = 4
5 | 30 = 31
5 & 20 = 4
5 | 20 = 21
4 & 12 = 4
4 | 12 = 12
4 & 4  = 4
4 | 4  = 4
8 & 4  = 0
8 | 4  = 12```
Was macht das?

[ot]
Wenn du in Google auch nach “verknüüfen” gesucht hast, ist auch klar, warum du nichts findest… :rolleyes:
[/ot]

Jede Zahl ist im Computer durch ein Bitmuster repräsentiert. Man kann sich das als eine Folge von 1en und 0en vorstellen. Details dazu gibt’s hier: https://de.wikipedia.org/wiki/Zweierkomplement

Jedenfalls führt das “&” eine Verknüpfung der Bits zweier Zahlen durch. Im Ergebnis ist ein Bit auf 1 gesetzt, wenn in der ersten UND (!) der zweiten Zahl an der entsprechenden Stelle ein Bit auf 1 gesetzt ist.

Als Beispiel:


   5 = 000101 
  20 = 010100 
       ------
5&20 = 000100 = 4

Für “|” gilt, dass im Ergebnis ist ein Bit auf 1 gesetzt wird, wenn in der ersten ODER (!) der zweiten Zahl an der entsprechenden Stelle ein Bit auf 1 gesetzt ist:


   5 = 000101 
  20 = 010100 
       ------
5|20 = 010101 = 21

Bitweises “and” bzw “or”

L00L & LLLL = L00L
L00L | 0LL0 = LLLL

bye
TT

Und der Vollständigkeit halber, ^ kann man auch so verwenden, da muss genau eines der Ausgangsbits gesetzt sein, damit ein Ergebnisbit gesetzt wird, also z.B 1100 ^ 0110 = 1010. Außerdem können ints mit ~ bitweise negiert werden.

Für solche sprachspezifischen Fragen ist die JLS ein guter Ausgangspunkt: https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.22