Bits einzeln setzen und 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