0

Das ist also ein Update zu meinem letzten Post, aber ich habe immer noch große Schwierigkeiten zu verstehen, wie das funktioniert. Also gab ich die Hauptfunktion:Bitweise Operationen und Einstellung "Flags"

void set_flag(int* flag_holder, int flag_position); 
int check_flag(int flag_holder, int flag_position); 

int main(int argc, char* argv[]) 
{ 
    int flag_holder = 0; 
    int i; 
    set_flag(&flag_holder, 3); 
    set_flag(&flag_holder, 16); 
    set_flag(&flag_holder, 31); 
    for(i = 31; i >= 0; i--) { 
     printf("%d", check_flag(flag_holder, i)); 
     if(i % 4 == 0) 
      printf(" "); 
    } 
    printf("\n"); 
    return 0; 
} 

Und für die Zuordnung sollen wir die Funktionen Set_Flag und check_flag schreiben, so dass der Ausgang ist gleich:

1000 0000 0000 0001 0000 0000 0000 1000 

Also von dem, was ich verstehe, , sollte die "set_flag" -Funktion verwenden, um sicherzustellen, dass das n-te Bit 1 ist. Und die Funktion "check_flag" gibt eine Ganzzahl zurück, die 0 ist, wenn das n-te Bit 0 ist, und 1, wenn es 1 ist verstehe, was "set_flag" wirklich macht, und wie 3, 16 und 31 als "flags" gespeichert werden, die dann als 1 in "check_flag" zurückkommen.

+0

Was haben Sie versucht und wo versagen Sie? Bitte lesen Sie [So erstellen Sie ein minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) –

Antwort

0

Wenn Sie mit binären oder hexadezimalen Werten arbeiten, ist es üblich, eine Maske zu definieren, die wir auf einen Hauptwert anwenden.

Mit dem ODER-Operator '|' können Sie einfach ein oder mehrere Bits auf '1' setzen.

zB: wollen wir das Bit # 0 auf '1' ein bestimmtes Bit zu testen

main value 01011000 | 
mask  00000001 = 
result  01011001 

setzen Sie den AND-Operator '&'

zB verwenden können: Wir wollen das testen Bit # 3

main value 01011000 & 
mask  00001000 = 
result  00001000 

Hinweis: Möglicherweise müssen Sie das Ergebnis richtig formatieren; hier wird die & Operation entweder Null oder nicht Null (aber nicht notwendig '1') zurückgeben.

hier sind also die zwei Funktionen Set_Flag und check_flag:

void set_flag(int* flag_holder, int flag_position) { 
    int mask = 1 << flag_position; 
    flag_holder = flag_holder | mask; 
} 

int check_flag(int flag_holder, int flag_position) { 
    int mask = 1 << flag_position; 
    int check = flag_holder & mask; 
    return (check !=0 ? 1 : 0); 
} 

In diesen Szenarien wir eine binäre Maske brauchen nur ein Bit gesetzt/Check. Der Code "int mask = 1 < < flag_position;" baut diese Einzelbitmaske auf, setzt das Bit # 0 auf '1' und verschiebt es dann nach links auf das #bit, das wir setzen/prüfen wollen.

0

Funktion Set_Flag und Funktion Check_flag:

void set_flag(int* flag_holder, int flag_position) { 
    int mask = 1 << flag_position; 
    *flag_holder = *flag_holder | mask; 
} 

int check_flag(int flag_holder, int flag_position) { 
    int mask = 1 << flag_position; 
    int check = flag_holder & mask; 

    return (check !=0 ? 1 : 0); 
} 

Run es zusammen mit dem Hauptprogramm und Sie erhalten die gewünschte Ausgabe erhalten.

Verwandte Themen