4 Stimmen

Makros zum Setzen und Löschen von Bits

Ich versuche, ein paar einfache Makros zu schreiben, um die Aufgabe des Setzens und Löschens von Bits zu vereinfachen, die eine einfache Aufgabe sein sollte, aber ich kann nicht scheinen, um sie richtig arbeiten zu lassen.

#define SET_BIT(p,n) ((p) |= (1 << (n)))
#define CLR_BIT(p,n) ((p) &= (~(1) << (n)))

11voto

Artelius Punkte 46771

Versuchen Sie

#define CLR_BIT(p,n) ((p) &= ~((1) << (n)))

Aus verschiedenen Gründen des allgemeinen Makro-Bösen würde ich jedoch davon abraten, ein Makro zu verwenden. Verwenden Sie eine Inline-Funktion und übergeben Sie diese per Referenz, etwa so:

static inline void set_bit(long *x, int bitNum) {
    *x |= (1L << bitNum);
}

8voto

CB Bailey Punkte 693084

Ein offensichtliches Problem ist, dass ((p) &= (~(1) << (n))) sollte sein ((p) &= ~(1 << (n))) .

Abgesehen davon müssen Sie mit der Breite Ihrer Integer-Typen vorsichtig sein. Wenn Sie unsigned long müssen Sie möglicherweise (z. B.) ((p) |= (1UL << (n)))

0voto

Michael Dorgan Punkte 12265

Igitt. Haben Sie nicht eine Reihe von Funktionen vor Ort, die dies für Sie erledigen? Das würde jede Art von Magie verbergen, die beim Überspringen von Wortgrenzen auftreten muss.

Wenn das nicht der Fall ist, was ist dann der Grund dafür? Sie sehen zwar gut aus, aber ich würde so etwas trotzdem lieber von Hand machen, wenn es keine Funktionen gibt. Makros verstecken bei dieser Art von Aufgaben nur unangenehme Bugs. Übergabe signiert vs unsigned, etc. Wird nicht mit Makros gefangen werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X