Verständnisfrage zu Bitshiften

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Verständnisfrage zu Bitshiften

    Hallo, ich benutze zurzeit eine Bibliothek zum Senden von Infrarot Codes. Unter anderem verwende ich da eine Methode sendRC5 bei der mir eine Sache nicht ganz klar ist. Hier mein der Auszug:

    Quellcode

    1. void IRsend::sendRC5(unsigned long data, int nbits)
    2. {
    3. enableIROut(36);
    4. //space ist pause, mark ist senden
    5. data = data << (32 - nbits); //unsigned long = 4 byte
    6. mark(RC5_T1); // Erstes start bit
    7. space(RC5_T1); // Zweites start bit pause
    8. mark(RC5_T1); // Zweites start bit
    9. for (int i = 0; i < nbits; i++) { //bits durchgehen und senden/pause oder pause/senden
    10. //je nach Togglebit erste senden dann pause oder anders herum
    11. if (data & TOPBIT) {
    12. space(RC5_T1);
    13. mark(RC5_T1);
    14. }
    15. else {
    16. mark(RC5_T1);
    17. space(RC5_T1);
    18. }
    19. data <<= 1; //nächstes Bit auswählen
    20. }
    21. space(0); // Ausschalten am Ende
    22. }
    Alles anzeigen


    Im Prinzip ist mir das Protokoll klar und auch was diese Methode macht. Mir ist nur nicht ganz klar warum diese Zeile notwendig ist:

    Quellcode

    1. data = data << (32 - nbits); //unsigned long = 4 byte

    Hier wird doch einfach data auf 32 bit mit führenden Nullen aufgefüllt oder ?!

    Also klar das unsigned long 4 byte groß ist ==> 32 bit. Aber was macht man hier genau ? Ist es weil sowohl die Adresse als auch der eigentliche Command beim RC5 Protokoll "Most Significant Bit First" gesendet wird ? (siehe hier:
    sbprojects.com/knowledge/ir/rc5.php)

    Vielen Dank für eure Antworten.

    EDIT: Sorry für die fürchterliche Formatierung... irgendwie spinnt der Editor ein wenig bei mir gerade.
  • Du übergibst immer nbits an Daten und die for Schleife schaut immer auf das obere Bit.
    In dem Moment wo "data" weniger als 32 bit enthält, muss der Rest hochgeschoben werden bevor die Schleife durchlaufen wird.

    Bei vollen 32bit passiert nichts:

    Quellcode

    1. data = data << (32 -32); // also data = data

    Wenn nur noch 8 bit da sind, werden die halt 24 bit nach vorne geschoben:

    Quellcode

    1. data = data << (32 - 8); // also data = data << 24


    EDIT:
    Aus 0x000000NN wird 0xNN000000, wobei die Nullen ja von rechts aufgefüllt werden.

    0x00000001 << 1 ist ja auch 0x00000002 also eine Null kommt von rechts ;)