Bitverknüpfung

dg87

Erfahrenes Mitglied
Hallo Java Freunde,

ich benötige wieder einmal Verständnis Hilfe.
Ich habe hier folgenden Code Ausschnitt um den es geht:

Code:
 public boolean hasRecieveEmailMasks(long... masks) {
    boolean bRet = true;
    if (masks != null && masks.length > 0) {
      bRet = false;
      for (long mask : masks) {
        if ((recieveEmails & mask) == mask) {
          bRet = true;
          break;
        }
      }
    }
    return bRet;
  }

Ich habe oben eben verschiedene ints definiert, hier ein Auszug:
Code:
 public static final int BIRHDAY = 2;
public static final int NAME=4;
public static final int bookmarked = 8;
public static final int EVENT = 16;
public static final int letzter_wert = 1024;

Der obigen Funktion wird in meinen Beispiel der long Wert 2 übergeben. Ich verstehe dann aber nicht, warum bei der letzten IF Prüfung bRet = True aufgerufen wird.
receiveEmails hat den Wert 11739
Dieser wird durch die "Verundung" der ints zusammengezählt. Nun wird in dieser Funktion geprüft, ob 2 (also BIRTHDAY) in dieser Maske enthalten ist (für eine Berechtigung). Aber woher weiß das System, dass die Bits 2 in dieser Zahl 11739 gesetzt sind?
Ich kenn das Binäre System, also dass zwei 00010 zB ist. Aber ich check nicht wie das System intern da vorgeht, dass zB BIRTHDAY und EVENT in dieser Zahl 11739 gesetzt sind...

Vll kann mir jemand helfen?

edit:

Jetzt habe ich es mal aufn Papier gemacht. Wenn ich zB als Wert 272 in der Datenbank habe, dann können das ja nur zwei Muster sein:
256 und 16

Andere Werte sind ja gar nicht möglich laut der Rechnung. Also müsste die IF Prüfung mir oben bei 272 einmal bei 256 und bei 16 TRUE rausschmeißen. Ich glaub ich habs kapiert :) Hoffe ich jedenfalls. Weil 128 und 64 und 32 und 16 ... zusammenaddiert kommt man ja nicht auf den Wert :)
 
Zuletzt bearbeitet:
Hi

das im edit klingt schon ganz gut.

Jede Zahl kann man aus der Summe von Zweierpotenzen (eben 1 2 4 8 16 32...) zusammenbauen.
(na gut, aus 1+1+1... kann man alles erzeugen; aber es geht auch,
wenn jede der verschiedenen Potenzen max. einmal verwendet wird)

272 ist, wie du sagst, 256+16, also 2^8 und 2^4

11739 wäre 1+2+8+16+64+128+256+1024+2048+8192
oder in Binärschreibweise
0001 0110 1110 11011
von hinten nach vorne: ein Einser, ein Zweier, kein Vierer, ein Achter, 16, kein 32, 64 wieder schon...

Und das binäre Und prüft, ob an der entsprechenden Stelle eine 1 ist.
&1 ist (von hinten nach vorne) die erste Stelle, &2 die nächste, &4, &8...


Für den Fall, dass du mal Masken hast, die keine reine Zweierpotenzen sind,
also mehr als einen Einser haben: Prinzip ist gleich, aber es hilft vllt.,
sich die Zahlen einfach binär hinzuschrieben.
Für den Fall 272 und 2:
0000 0001 0001 0000
0000 0000 0000 0010
Zusammengeundet als Bedingung wie oben im Code ists dann wahr,
wenn jede 1-Stelle der unteren Zahl (Maske eben) auch eine 1 darüber hat.
Also oben ist nicht richtig,
0000 0001 0001 0010
0000 0000 0000 0010
ist richtig (274&2)
 
Ganz schön kompliziert irgendwie. Gibt es dafür ein gutes Tutorial, ich weiß nicht ganz nach was ich da googlen soll in diesem speziellen Fall.
Aber es war schon sehr hilfreich, ich verstehe es auch. Nur wenn ich das wieder aus den Augen verliere ist es wieder weg. Ich danke dir!
 
Hallo

Ohje, du armer; ich kann dich trösten: Da mussten alle von uns durch ;)

Bitmaskierungen zu lernen ist wie SQL zu lernen: Am besten so lange üben, bis einem die Finger ab- und die Augen rausfallen :p

Im Internet müsstest du Übungen dazu finden. Eine einfache Übung ohne Maskierung wäre das Setzen von Berechtigungen in einem Linux FS.
Mit Maskierung wäre es das Herausfinden eines Subnets von einer IP. Also in welchem Subnet ist IP xy mit Subnetmask yx?

Tipp: Bitmaskierungen lassen sich in Java ohne "auszuprogrammieren" durchführen. Das aber bitte nur verwenden, um deine Resultate zu überprüfen
& = AND
| = OR
^ = XOR

Gruss,
slowy
 
Zuletzt bearbeitet:
Zurück