Hi, bin mit dem Bit-Shift-Operator noch nicht so vertraut und wollte mal fragen ob das so funktioniert. Ich habe ein Array mit 3 unsigned char Werten an der Stelle 5,4,3. Diese Stellen eine 24 Bit Variable dar, die ich asuwerten möchte. 1.) Ich nehme dafür eine neue Variable vom Typ long 2.) Da die bits vertauscht sind muss ich mit dem MSB bei Stelle 5 anfangen unsigned long size; size = array[5]; size = (size << 8); size = array[4]; size = (size << 8); size = array[4]; nun sollte size aus folgendem Wert bestehen: size = 0x00array[5]array[4]array[3]; ist das so ok oder überschreibe ich mit size = array[4]; wieder alle Stellen ?
> bin mit dem Bit-Shift-Operator noch nicht so vertraut Die verweendest du richtig, aber die Zuweisung nicht. > ist das so ok oder überschreibe ich mit size = array[4]; wieder alle > Stellen ? Letzteres. Ändere es in:
1 | size = array[5]; |
2 | size = (size << 8); |
3 | size |= array[4]; |
4 | size = (size << 8); |
5 | size |= array[3]; |
ich hab das gefühl bei allen klappt es nur bei mir nicht ... ich möchte zwei bytes in eine 16bit variable schreiben. sollange ich nur die letzten 12 bits benutze funktioniert es tatellos. wenn ich aber zb FF und FF zusammenfügen will kommt 000001 raus und nicht FFFF. ich benutz einen mega32 und winavr. uint8_t top = 0xFF; uint8_t bottom = 0xFF; uint16_t size=0; size = top; size = (size << 8); size |= bottom; müßte doch funktionieren oder?
Wie gibst du den Wert von 'size' aus? Vielleicht wird da mit einer signed variablen gearbeitet, dann entspricht 0xffff üblicherweise (zumindest bei 16-Bit) dezimal -1. Was ist es denn für einen Compiler? Du könntest auch versuchen, 'top' und 'bottom' vor dem Speichern noch explizit nach 'uint16_t' zu casten. Oder so:
1 | size = ((uint16_t)top << 8) | (uint16_t)bottom; |
besten dank!!! mittlerweile läuft es!! die ausgabe funktion nutze ich für alles mögliche deshalb war da eine abs() mit drin. einen unsigned scheint er nach abs() zum signed zumachen oder was auch immer, jedenfalls funktioniert das nun ohne ;)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.