Bits einzeln setzen und löschen



  • 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