Harry: (MATHEMATIK) (DATENBANK) Zahl in 2-er Potenzen zerlegen

Beitrag lesen

Holladiewaldfee,

ich habe vor kurzem ein Projekt übernommen, das gewisse Zustazinformationen zu einem Eintrag in der Datenbank in Form von Flags speichert. Diese Flags werden alle in einer einzigen Zahl zusammengefasst und mit dem entsprechenden Eintrag in der Datenbank gespeichert.

Jede Eigenschaft, die im Flag gespeichert wird, ist anhand einer 2er-Potenz eindeutig zu identifizieren, z.B.

1 (2^0): Leserechte
2 (2^1): Schreibrechte
4 (2^2): Sinnloser Eintrag
8 (2^3): Absoluter Quatsch
usw.

Diese Zahlen werden dann zum endgültigen Flag zusammen addiert, also z.B. ein User hat für einen absoluten Quatsch Lese- und Schreibrechte:

1 + 2 + 8 = 11

Das ist schön und gut, bloß in dem Moment wo ich einzelne Datensätze aus der Datenbank auslesen möchte, bei denen nur eine bestimmt Eigenschaft zutrifft, wird's eklig.
Im Moment ist das so gelöst, daß alle Datensätze aus der Datenbank geholt werden und dann die Zahl zerlegt wird. Dafür habe ich mir einen einfachen Algorithmus ausgedacht:

Zunächst wird floor(log_2(zahl)) berechnet. Damit erhalte ich die höchste Zweierpotenz, die in der Zahl vorkommen kann. Anschließend überprüfe ich mit Hilfe einer rückwärtslaufenden Schleife, ob eine Zweierpotenz in der Zahl Platz hat. Wenn ja, dann wird die entsprechende Zweierpotenz abgezogen. Irgendwann komme ich dann zu dem Punkt, an dem ich überprüfen kann, ob die gesuchte Zweierpotenz in der Restzahl noch Platz hat.

Beispiel:
Kommt 2^2 in 179 vor.
log_2(179) = 7.x
=> Schleife von 7 aus abwärts zählen
2^7 = 128 < 179 => 179 - 128 = 51
2^6 = 64 > 51
2^5 = 32 < 51 => 51 - 32 = 19
2^4 = 16 < 19 => 19 - 16 = 3 (Ausstieg hier)
2^3 = 8 > 3
2^2 = 4 > 3
=> 2^2 ist kein Bestandteil der Zweierpotenzenzerlegung.

Nun ist diese ganze Sache aber leider höllisch ineffektiv sobald die Anzahl der Datensätze größer wird.

Deswegen die Frage: Gibt es eine einfache mathematische Rechnung mit deren Hilfe ich feststellen kann, ob eine bestimmte Potenz von 2 in der Zerlegung einer Zahl vorkommt? "Einfach" heißt hier: Ein Einzeiler, also kein Algorithmus, der auf eine Schleife zurückgreift. Dann könnte ich die Auswahl der richtigen Datensätze nämlich schon der Datenbank überlassen. Oder gibt es evtl. sogar einen Datenbankbefehl, der diese Zerlegung für mich übernimmt?
Falls nein: Gibt es evtl. einen effektiveren Algorithmus (obiger lässt sich nur durch eine intelligentere Ausstiegsbedingung beschleunigen, also sobald der Rest kleienr 2^x ist: Ausstieg)?

Vielen Dank schonmal.

Ciao,

Harry

--
  Hä? Was? Signatur?! Kann man das essen?