Laden...

Bit-weise vergleichen

Erstellt von Chaser0815 vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.742 Views
C
Chaser0815 Themenstarter:in
55 Beiträge seit 2006
vor 17 Jahren
Bit-weise vergleichen

Hallo,

ich habe da ein Problem. Um eine Anmeldung zu realisieren und möglichst einfach die Rechte der angemeldeten Person auswerten zu können, habe ich mir überlegt einen Zahlenwert bitweise zu vergleichen um zu schauen welches Bit gesetzt und damit welche Rechte erteilt werden.

Nun zu meinem Problem, ich bekomme dauernd eine Meldung das der Integer nicht in einen Bool konvertiert werden kann, obwohl ich mir sicher bin das der Ansatz richtig ist. (Hab es vor Monaten mal wo gesehen, aber weiss es nur noch ruchstückhaft)

Hier mal ebend ein Stück Code, wie ich es bisher stehen habe :

int rechte = 10;

if ( rechte&1 == 2)
tu_dies();

In dem Beispiel sollte das Bit "2" gesetzt sein und tu_dies() aufgerufen werden.

Danke fürs lesen, vielleicht kann mir einer einen Hinweis geben, wo ich mir die Geschichte anlesen kann, oder den entscheidenen Tip auf meinen Fehler geben.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Chaser0815,

am besten verwendest du statt der Zahlenwerte Enum-Werte und statt int den Typ des Enums. Das löst dann vermutlich nebenbei auch noch dein Problem.

herbivore

S
8.746 Beiträge seit 2005
vor 17 Jahren

Da outet sich ein Ex-C-Programmierer 😉

Herbi hat den richtigen Weg gewiesen. Ergänzend sei gesagt, dass man für einen solchen Zweck Enums verwendet, die mit dem Flags-Attribute ausgezeichnet werden:

 
[FlagsAttribute] 
enum MultiHue : short
{
        Black = 0, 
        Red = 1, // Bit 0
        Green = 2, // Bit 1
        Blue = 4 // Bit 2
};

S
1.047 Beiträge seit 2005
vor 17 Jahren

die anderen haben ja schon gesagt, das enum für sowas geeigneter ist
dem solltest du auch nachgehen 🙂

trotz allem mal die berichtigung deines codes

  
int rechte = 10;  
     
if ( rechte&1 == 2)  
    tu_dies();  

In dem Beispiel sollte das Bit "2" gesetzt sein und tu_dies() aufgerufen werden.

da sollte dann eher so aussehen


int rechte = 10;
if(rechte & 2 != 0) {
    tu_dies();
}

um das mal bitweise darzustellen


     1010b (dezimal 10)
  &  0010b (dezimal 2)
---------------------------
     0010b (dezimal 2)

und da das != 0 ist, erkennst du so dass das/die entsprechende(n) bit gesetzt ist/sind

C
Chaser0815 Themenstarter:in
55 Beiträge seit 2006
vor 17 Jahren

Danke für die Hilfe, ich werde es dann mal in Ruhe @home heute Abend durchgehen und mich dann den Enums widmen, denke ich mal 😉

354 Beiträge seit 2004
vor 17 Jahren

Soll jetzt keine Werbung darstellen, aber dennoch der Hinweis auf mein Weblog. Hier findet sich ein Eintrag, der sich mit den Grundlagen rund um Enumeratoren und Flags beschäftigt:
http://blog.norberteder.com/index.php?entry=entry060609-122806

.NET GUI - Die Community für grafische Oberflächen unter .NET
Jetzt kostenlos besorgen: .NET BlogBook
Norbert Eder
DasBackup

C
Chaser0815 Themenstarter:in
55 Beiträge seit 2006
vor 17 Jahren

Danke noch einmal an alle 🙂 Ich habe es mittlerweile am laufen und wollte noch ebend Danke sagen.
Da ich mich aber zur Zeit (ich werde mir das mal weiter anschauen) aber noch nicht mit den Enums anfreunden kann (es ist ein Projekt mit mehreren Leuten und ich bin in der Unterzahl 😦 ) werde ich wohl erst meine momentane Lösung nehmen müssen 😉

@ Sheitman

int rechte = 10;
if((rechte & 2) != 0) 
{
    tu_dies();
} 

So klappt es zumindest bei mir richtig 🙂
Du hattest nur die innere Klammer zu wenig.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Chaser0815,

gerade wenn meherer Leute an dem Projekt arbeiten, ist es wichtig Enums zu verwenden! Die autmatische Dokumentationswirkung von Enums (man weiß direkt aus dem Code, auf welche Rechte abgefragt wird) ist Gold wert.

herbivore

C
Chaser0815 Themenstarter:in
55 Beiträge seit 2006
vor 17 Jahren

Hallo Herbivore,

ich würde dich gerne einladen, die anderen davon zu überzeugen. Mir ist es leider noch nicht gelungen. Aber mal schauen, immerhin ist ein Schulprojekt und wir sollen da ja aus Fehlern lernen 8)

mfg Chaser

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Chaser0815,

sag ihnen, nach Auffassung gestandener und professioneller Informatiker stellt der Verzicht auf Enums in diesem Fall einen kaum zu überbietenden Diletantismus dar. Das meine ich wirklich so.

herbivore

S
1.047 Beiträge seit 2005
vor 17 Jahren

Du hattest nur die innere Klammer zu wenig. ja die lieben klammern 🙂