Bits elegant aus Integer extrahieren
lima-city → Forum → Programmiersprachen → Sonstige Programmiersprachen
abfragen
abnehmen
auslese
bit
break
code
dank
folgendes code
http
integer speichern
option
prima code
problem
set
speichern
stelle
testen
url
verwenden
wald
-
Hi!
Ich habe eine MySQL Tabelle in welcher ich zu einem Objekt viele Optionen speichern möchte. Anstatt diese Optionen jetzt aber in 30 boolean Werten zu speichern hab ich gedacht ich kann diese auch einfach zusammen in einem Integer speichern. Funktioniert auch prima:
OPTION1 = 1; OPTION2 = 2; OPTION3 = 4; OPTION4 = 8; OPTION5 = 16; OPTION6 = 32; OPTION7 = 64; OPTION8 = 128; OPTION9 = 256; OPTION10 = 512; [...] options = OPTION5 | OPTION7 | OPTION10; //Hat jetzt den Integer-Wert 592
Jetzt aber das Problem: Wie kann ich die Optionen mit möglichst elegantem und aussagekräftigen Code wieder auslesen? Im Moment habe ich folgendes:
for(i=0; i<32; i++){ if((options) & (1<<(i))){ //Testen ob bit an Stelle i gesetzt ist switch(i){ case 0: echo "Option 1 was selected"; break; case 1: echo "Option 2 was selected"; break; case 2: echo "Option 3 was selected"; break; case 3: echo "Option 4 was selected"; break; [...] case 31: echo "Option 32 was selected"; break; } } }
Das ist aber meiner Meinung nach nicht sehr elegant und auch nicht super aussagekräftig (für wenn ich mich später wieder in den Code reinlesen muss). Besser wäre es wenn ich irgendwie die OPTIONX-Konstanten wieder in den zweiten Codeabschnitten bringen könnte. Gibt es speziell für dieses Problem eine bessere Lösung?
Danke,
Wrertzu
Beitrag zuletzt geändert: 1.4.2012 19:38:57 von wrertzu -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hast du dir den MySQL Datentyp SET schonmal angeschaut? Der dürfte dir viel Arbeit abnehmen:
http://dev.mysql.com/doc/refman/5.6/en/set.html
Alternativ wäre es sinnvoll sich für jede Option entsprechende Konstanten zu definieren
const int DASISTTOLL = 1024;
Und dann an den entsprechenden Stellen einfach
if( config & DASISTOLL ) {}
abfragen.
Beitrag zuletzt geändert: 1.4.2012 20:04:42 von bladehunter -
Wie wäre es alternativ mit:
for(i=0; i<32; i++){ if((options) & (1<<(i))) { //Testen ob bit an Stelle i gesetzt ist echo "Option " + (i +1) + " was selected"; } }
Je nach Prog-Sprache andere String zusammenführungszeichen statt + verwenden.
Und (i+1) nur wenn Optionen bei 1 anfangen sollen. Ansonsten nur i statt (i+1) verwenden.
Beitrag zuletzt geändert: 9.5.2012 15:36:13 von claushoffmann -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage