Forum: Compiler & IDEs C Bitoperation: 32 zu 4*8


von olpo (Gast)


Lesenswert?

hallo,

ich habe eine Uint32 Variable.
Wie kann ich die aufteilen in ein Uint8 Array[4] ?
Also, es soll in Array[0] das höchstwertige Bit stehen und in Array[3] 
das minderwertigste.

von Εrnst B. (ernst)


Lesenswert?

union aus uint32_t und uint8_t[4].

beim Füllen "htonl" verwenden.

von Udo S. (urschmitt)


Lesenswert?

Kommt darauf an ob der verwendete Rechner/Prozessor "big endian" oder 
"low endian" ist.

von Jim M. (turboj)


Lesenswert?

>> beim Füllen "htonl" verwenden.
> Kommt darauf an ob der verwendete Rechner/Prozessor "big endian" oder
> "low endian" ist.

Nicht, wenn man htonl() verwendet. Das soll die "network byte order" 
herstellen, d.h. "big endian" wie es der OP haben will.
Außerdem heisst das Gegenteil "little endian".

von olpo (Gast)


Lesenswert?

och, das läuft auf einem µC; ich würde es lieber per Hand machen.
Ob Big- oder Little Ending kann ich ja schnell ausprobieren.

von DirkB (Gast)


Lesenswert?

Schieben und maskieren.
1
Array[0] = (Variable >> 24) & 0xff;
2
Array[1] = (Variable >> 16) & 0xff;
3
Array[2] = (Variable >>  8) & 0xff;
4
Array[3] = (Variable      ) & 0xff;

von Rolf Magnus (Gast)


Lesenswert?

Εrnst B✶ schrieb:
> union aus uint32_t und uint8_t[4].

Das ist abgesehen davon, daß es in C eigentlich verboten ist, auch recht 
umständlich. Da würde ich lieber einen Pointer-Cast machen.

DirkB schrieb:
> Schieben und maskieren.

Das ist auch endian-unabhängig, wird aber vom Compiler auf manchen µCs 
nicht optimal umgesetzt.

von Honkihonkohonkahu (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Das ist abgesehen davon, daß es in C eigentlich verboten ist, auch recht
> umständlich.

In MISRA-C ist es vielleicht verboten aber warum soll das in C89 
und/oder C99 verboten sein?

Rolf Magnus schrieb:
> Da würde ich lieber einen Pointer-Cast machen.

Ack

von Stefan E. (sternst)


Lesenswert?

Honkihonkohonkahu schrieb:
> In MISRA-C ist es vielleicht verboten aber warum soll das in C89
> und/oder C99 verboten sein?

Weil der C-Standard eigentlich ausdrücklich sagt, dass man aus einer 
Union nur denjenigen Member lesen darf, der auch als letztes beschrieben 
wurde.

von Honkihonkohonkahu (Gast)


Lesenswert?

Stefan Ernst schrieb:
> Weil der C-Standard eigentlich ausdrücklich sagt, dass man aus einer
> Union nur denjenigen Member lesen darf, der auch als letztes beschrieben
> wurde.

Ergibt Sinn, ich sollte wohl um diese Uhrzeit wohl nicht zu allem meinen 
Senf dazu geben ;)

von olpo (Gast)


Lesenswert?

Also, die "sauberste" Methode ist tatsächlich der böse Pionter-Cast?

von Simon K. (simon) Benutzerseite


Lesenswert?

Das ist die sauberste Methode, weil man damit genau sagt, welches Byte 
wo hin soll. Durch Pointerbastelei oder Unionbastelei kann man 
unterschiedliche Ergebnisse, je nach Compiler, Plattform, etc bekommen.

DirkB schrieb:
> Schieben und maskieren.
>
1
> Array[0] = (Variable >> 24) & 0xff;
2
> Array[1] = (Variable >> 16) & 0xff;
3
> Array[2] = (Variable >>  8) & 0xff;
4
> Array[3] = (Variable      ) & 0xff;
5
>

von DirkB (Gast)


Lesenswert?

Wenn die CPU keinen Barrel-Shifter hat, kann man ja auch mit einer 
Hilfsvariablen arbeiten und die dann jeweils 8 Stellen verschiebt.

von Vlad T. (vlad_tepesch)


Lesenswert?

DirkB schrieb:
> Wenn die CPU keinen Barrel-Shifter hat, kann man ja auch mit einer
> Hilfsvariablen arbeiten und die dann jeweils 8 Stellen verschiebt

das wird der compiler wohl von alleine optimieren.
Ich könnte wetten, dass im Assembly kein einzige(r) Shift oder 
Maskierung enthalten ist.

von Simon K. (simon) Benutzerseite


Lesenswert?

DirkB schrieb:
> Wenn die CPU keinen Barrel-Shifter hat, kann man ja auch mit einer
> Hilfsvariablen arbeiten und die dann jeweils 8 Stellen verschiebt.

Unsinn. Dieser C-Code wird in 99.9% aller Fälle in 0 Extra-Instruktionen 
umgesetzt. Gleichzeitig hat man sauber definiert, was wo landen soll. 
Also -> saubere Lösung.

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.