Forum: PC-Programmierung long umwandeln in 3 bytes


von Hans (Gast)


Lesenswert?

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

von Roland P. (pram)


Lesenswert?

byte zerothByte = byte(toConvert >> 16);

von shift and mask (Gast)


Lesenswert?

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);

von Hans (Gast)


Lesenswert?

Vielen Dank. Das funktioniert!

von Purzel H. (hacky)


Lesenswert?

Long ist ja 4 byte, dh eins ist zuviel, und das ist sowieso Null...

von Dr. Sommer (Gast)


Lesenswert?

Siehe auch Serialisierung.

von Ulf (Gast)


Lesenswert?

Hallo

Ich würde das einfach in einer union zusammenfassen. Da teilen sich dann 
long und unsigend char[4] den gleichen Speicherplatz.

Gruß Ulf

von Ulf (Gast)


Lesenswert?

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

von Dr. Sommer (Gast)


Lesenswert?

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.

von Dirk B. (dirkb2)


Lesenswert?

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
Noch kein Account? Hier anmelden.