Hallo, ich habe eine Zahl (max.) 8388607 und möchte die in 3 Bytes aufteilen um diese auf 3 595 Shiftregister schieben zu können. Für 2 bytes habe ich etwas gefunden, aber wie hänge ich da ein 3 byte dran? long toConvert = 8388607; byte firstByte = byte(toConvert >> 8); byte secondByte = byte(toConvert & 0x00FF); Vielen dank
Hans schrieb: > long toConvert = 8388607; > byte firstByte = byte(toConvert >> 8); > byte secondByte = byte(toConvert & 0x00FF);
1 | long toConvert = 8388607; |
2 | byte zeroByte = byte(toConvert & 0xFF); |
3 | byte firstByte = byte((toConvert >> 8) & 0xFF); |
4 | byte secondByte = byte(toConvert >> 16)& 0xFF); |
Hallo Ich würde das einfach in einer union zusammenfassen. Da teilen sich dann long und unsigend char[4] den gleichen Speicherplatz. Gruß Ulf
Hier ein kleines Beispiel:
1 | union {long int i; unsigned char b[4];} pos; |
2 | |
3 | pos.i = DeinLongWert; |
4 | |
5 | LowByte = pos.b[0]; |
6 | MidByte = pos.b[1]; |
7 | HiByte = pos.b[2]; |
Gruß Ulf
union ist ausschließlich zum Speicher Sparen und nicht zum Daten konvertieren da. Das Ergebnis einer union-Konvertierung ist in C Plattform-abhängig und in C++ (und darum handelt es sich vermutlich, sieht nach Arduino aus) ist es ganz verboten und kann beliebig schief gehen. Bitshifts sind die einzig korrekte Variante. Das steht auch alles im verlinkten Artikel.
Ulf schrieb: > Ich würde das einfach in einer union zusammenfassen. Nein. Der Code mit schieben und maskieren ist Portabel und funktioniert auf jeder Architektur (Big- oder Low-Endian). Der Compiler kann das optimieren und nutzt dann die Bytezugriffe (wenn vorhanden)
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.