Bits einzeln setzen und löschen



  • Hallo zusammen,
    ich wollte mal reinhören, ob Ihr eine Möglichkeit kennt die Bits eines Bytes einzeln auszulesen, zu setzen oder zu löschen.

    Also ich lese ein Byte aus einem bestimmten Adressbereich:

    wert = inb(port);
    

    Nun möchte ich wissen, ob im Inhalt von Wert z.B. das erste Bit gesetzt ist. Die anderen interessieren mich nicht. Wenn es gesetzt ist, soll es gelöscht werden. Die anderen Bits sollen davon aber unberührt bleiben. Ich habe das mit allen möglichen Bit-Operatoren versucht, aber hier wird immer das komplette Byte verändert. Kann mir da jemand einen Tip geben? Ich versuche es gerade mit Bit-Feldern, da ich das vor vielen Jahren mal gemacht habe, aber vielleicht gibt es ja einen viele eleganteren Weg?

    Vielen Dank vorab

    Gruss Christian



  • if (wert & 1)  // bit gesetzt?
    {
      wert = wert & ~1;  // bit löschen
    }
    

    🙂



  • // erstmal die Bits:
    
    #define BIT1 1
    #define BIT2 2
    #define BIT3 4
    #define BIT4 8
    #define BIT5 16
    #define BIT6 32
    #define BIT7 64
    #define BIT8 128
    
    // Ein Byte
    
    typedef unsigned char Byte;
    
    // Ein Bit setzen
    
    Byte bs = BIT2;
    
    // Noch ein Bit hinzufügen
    
    bs |= BIT3 | BIT5;  // Das fügt die Bits 3 und 5 hinzu
    
    // Prüfen, ob Bit 4 vorhanden ist
    
    if (bs & BIT4)
    {
    
    // Wenn es vorhanden wäre: Bit löschen
    bs ^= bs & BIT4;
    
    } 
    else
    {
    // Wenn Bit 4 nicht vorhanden ist: Bit setzen
    bs |= BIT4;
    }
    
    // das ganze wieder auf 0 setzen
    // bs = 0 ist hier einfach zu umständlich xD
    bs ^= bs;
    


  • DrakoXP schrieb:

    // erstmal die Bits:
    #define BIT1 1
    #define BIT2 2
    #define BIT3 4
    #define BIT4 8
    #define BIT5 16
    #define BIT6 32
    #define BIT7 64
    #define BIT8 128
    

    der echte geek fängt bei 0 an, ausserdem:

    #define BIT(x) (1<<(x))
    

    🙂



  • bitzi schrieb:

    #define BIT(x) (1<<(x))

    👍



  • #define _BV(x) (1<<(x))
    #define bit_is_set(value, n) ((value) & _BV(n))
    #define bit_is_cleared(value, n) (!(bit_is_set((value), (n)))
    #define bit_set(value, n) ((value) | _BV(n))
    #define bit_clear(value, n) ((value) & ~_BV(n))



  • der mit dem avr tanzt schrieb:

    #define bit_is_set(value, n) ((value) & _BV(n))

    #define bit_is_set(value, n) !!((value) & _BV(n))
    


  • der mit dem bool tanzt schrieb:

    der mit dem avr tanzt schrieb:

    #define bit_is_set(value, n) ((value) & _BV(n))

    #define bit_is_set(value, n) !!((value) & _BV(n))
    

    Dann macht mir mein Compiler aus allen Werten eine 1. Das will ich nicht, so kostet das jedes mal wertvollen Flash-Speicher für das Programm!



  • der mit flasharmut schrieb:

    der mit dem bool tanzt schrieb:

    der mit dem avr tanzt schrieb:

    #define bit_is_set(value, n) ((value) & _BV(n))

    #define bit_is_set(value, n) !!((value) & _BV(n))
    

    Dann macht mir mein Compiler aus allen Werten eine 1. Das will ich nicht, so kostet das jedes mal wertvollen Flash-Speicher für das Programm!

    Mein Compiler kann optimieren, deiner nicht?



  • der mit dem megacompiler schrieb:

    der mit flasharmut schrieb:

    der mit dem bool tanzt schrieb:

    der mit dem avr tanzt schrieb:

    #define bit_is_set(value, n) ((value) & _BV(n))

    #define bit_is_set(value, n) !!((value) & _BV(n))
    

    Dann macht mir mein Compiler aus allen Werten eine 1. Das will ich nicht, so kostet das jedes mal wertvollen Flash-Speicher für das Programm!

    Mein Compiler kann optimieren, deiner nicht?

    Keine Ahnung mein avr-gcc erzeugt mit den zwei Negationsoperatoren auf jeden Fall eine größere Binärdatei, und die Semantik ist ja wohl gleich - außer jemand schreibt bit_is_set(byte, 0) == 1, aber das tu ich nie.



  • der dens net intressiert schrieb:

    der mit dem megacompiler schrieb:

    der mit flasharmut schrieb:

    der mit dem bool tanzt schrieb:

    der mit dem avr tanzt schrieb:

    #define bit_is_set(value, n) ((value) & _BV(n))

    #define bit_is_set(value, n) !!((value) & _BV(n))
    

    Dann macht mir mein Compiler aus allen Werten eine 1. Das will ich nicht, so kostet das jedes mal wertvollen Flash-Speicher für das Programm!

    Mein Compiler kann optimieren, deiner nicht?

    Keine Ahnung mein avr-gcc erzeugt mit den zwei Negationsoperatoren auf jeden Fall eine größere Binärdatei, und die Semantik ist ja wohl gleich - außer jemand schreibt bit_is_set(byte, 0) == 1, aber das tu ich nie.

    Dreckige Lüge!!

    $ cat test-avr.c 
    volatile char* p = (char*)0xABC; // nicht wegoptimieren
    
    #define _BV(x) (1 << (x))
    #if defined(NEG)
        #define bit_is_set(value, n) !!((value) & _BV(n))
    #else
        #define bit_is_set(value, n) ((value) & _BV(n))
    #endif
    
    int main() {
        char c = *p;
        if(bit_is_set(c, 4))
            *p = 0xAA; // damit if nicht wegoptimiert
    }
    
    $ avr-gcc test-avr.c -Os -o test1.hex
    $ avr-gcc test-avr.c -DNEG -Os -o test2.hex
    $ stat -f "%z %N" test*.hex
    3091 test1.hex
    3091 test2.hex
    


  • der entlarver schrieb:

    der dens net intressiert schrieb:

    der mit dem megacompiler schrieb:

    der mit flasharmut schrieb:

    der mit dem bool tanzt schrieb:

    der mit dem avr tanzt schrieb:

    #define bit_is_set(value, n) ((value) & _BV(n))

    #define bit_is_set(value, n) !!((value) & _BV(n))
    

    Dann macht mir mein Compiler aus allen Werten eine 1. Das will ich nicht, so kostet das jedes mal wertvollen Flash-Speicher für das Programm!

    Mein Compiler kann optimieren, deiner nicht?

    Keine Ahnung mein avr-gcc erzeugt mit den zwei Negationsoperatoren auf jeden Fall eine größere Binärdatei, und die Semantik ist ja wohl gleich - außer jemand schreibt bit_is_set(byte, 0) == 1, aber das tu ich nie.

    Dreckige Lüge!!

    $ cat test-avr.c 
    volatile char* p = (char*)0xABC; // nicht wegoptimieren
    
    #define _BV(x) (1 << (x))
    #if defined(NEG)
        #define bit_is_set(value, n) !!((value) & _BV(n))
    #else
        #define bit_is_set(value, n) ((value) & _BV(n))
    #endif
    
    int main() {
        char c = *p;
        if(bit_is_set(c, 4))
            *p = 0xAA; // damit if nicht wegoptimiert
    }
    
    $ avr-gcc test-avr.c -Os -o test1.hex
    $ avr-gcc test-avr.c -DNEG -Os -o test2.hex
    $ stat -f "%z %N" test*.hex
    3091 test1.hex
    3091 test2.hex
    

    Verdammt ich hatte unrecht. Ich würde dir gerne meine Tastatur als Zeichen meiner Unterlegen überreichen.



  • Reduziert eure quotes bitte auf das notwendige. Die restlichen Müllbeiträge hab ich weggelöscht.

    PS: lowercase-Macros...



  • was ist BV?

    cu



  • ratte schrieb:

    was ist BV?

    'besloten vennootschap', eine holländische gesellschaftsform, vergleichbar mit 'ner GmbH in deutschland.
    ne, im ernst, guck mal oben. das ist ein makro (1<<(x))
    🙂



  • jap schon gesehen;)

    unsigned int reg = 4;
    
    if(bit_is_set(reg, 3))
    

    bit3 ist nicht gesetzt? hmmm



  • ratte schrieb:

    bit3 ist nicht gesetzt? hmmm

    richtig. 2^3 ist 8, nicht 4
    🙂



  • meinte bit2;)

    ist aber auch nicht gesetzt;/

    4 = 100



  • das geht nicht, warum? errorcode ist danach noch immer 0

    unsigned int errorcode = 0;
    unsigned int reg = 4;
    
    if(bit_is_set(reg, 2))
    {
    	bit_set(errorcode, 6);
    }
    


  • das makro wird gar nicht ausgeführt...hrrr


Anmelden zum Antworten