Forum: PC-Programmierung Dezimalzahl in vier 8 Bit segmente aufteilen - in C


von Dominik (Gast)


Lesenswert?

Hallo!

Ich bin am Schreiben eines Programmes für die Uni.
Bei einem Teil steh ich gerade an: Ich habe eine Dezimalzahl, die ich in 
vier 8 Bit große Teile spalten und in jeweils eine Variable speichern 
soll.

Nehmen wir an, diese Zahl sei 123456789 was Binär

0000 0111 | 0101 1011 | 1100 1101 | 0001 0101  und Dezimal aufgespalten

    7           91         205          21

ergäbe.

Wie gehe ich da mit Masken und shifting richtig ran, sodass ich die vier 
Dezimalen Teile in vier unterschiedliche Variablen speichern kann? Die 
Eingangs erwähnte Dezimalzahl kann sich natürlich ändern, die ist nicht 
fix.

Ich hab nur sehr einfache Mittel zur verfügung, ich darf keine Arrays 
o.ä. verwenden.

Hat jemand eine Idee, wie ich das lösen könnte? Danke schonmal!

LG

von Matthias L. (Gast)


Lesenswert?

>ich darf keine Arrays

Wer sagt das?

Klingt so wie, was mir den Pelz, aber mach mich nicht nass...

von A. B. (funky)


Lesenswert?

double zahl;
U8 z1,z2,z3,z4,

z1 = zahl & 0xff;
z2 = (zahl >> 8) && 0xff;
z3 = (zahl >> 8) && 0xff;
z3 = (zahl >> 8) && 0xff;

von Martin H. (disjunction)


Lesenswert?

x1 =  x & 0xFF;
X2 = (x >> 8) & 0xFF;
X3 = (x >> 16) & 0xFF;
X4 = (x >> 24) & 0xFF;

von Martin H. (disjunction)


Lesenswert?

A. B. schrieb:
> z3 = (zahl >> 8) && 0xff;

&& ist eine logische Operation kommt nur 1 oder 0 raus

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

A. B. schrieb:
> double zahl;
> U8 z1,z2,z3,z4,
>
> z1 = zahl & 0xff;

Nein. Ganz sicher nicht. Nicht mit double.

> z2 = (zahl >> 8) && 0xff;
> z3 = (zahl >> 8) && 0xff;
> z3 = (zahl >> 8) && 0xff;

Und das ist dreimal das gleiche, auch wenn man den Tippfehler in der 
letzten Zeile korrigiert und z3 durch z4 ersetzt.

von Dominik S. (guitarking)


Lesenswert?

Matthias Lipinsky schrieb:
>>ich darf keine Arrays
>
> Wer sagt das?
>
> Klingt so wie, was mir den Pelz, aber mach mich nicht nass...

Die Aufgabenstellung der Übung sagt das ;)

Rufus Τ. Firefly schrieb:
> A. B. schrieb:
>> double zahl;
>> U8 z1,z2,z3,z4,
>>
>> z1 = zahl & 0xff;
>
> Nein. Ganz sicher nicht. Nicht mit double.
>
>> z2 = (zahl >> 8) && 0xff;
>> z3 = (zahl >> 8) && 0xff;
>> z3 = (zahl >> 8) && 0xff;
>
> Und das ist dreimal das gleiche, auch wenn man den Tippfehler in der
> letzten Zeile korrigiert und z3 durch z4 ersetzt.

Richtig. Mit double gehts nicht.
Dass das 3 Mal das Selbe ist, hab ich auch gleich gesehn. Habs dann 
gegen 8, 16, 31 getauscht, aber funktioniert leider auch nicht.

Rauskommen soll als Ergebnis (bei der Zahl in dem Übungsbeispiel
10.0.32.1

mit eurem Vorschlag jedoch (und dem ersetzten 8,16,31) komme ich auf
0.0.32.1

D.h. mit 31 komme ich nicht aus, da mir eine Stelle am Anfang fehlt, 
aber 32 geht ja nicht. Was also tun?

: Bearbeitet durch User
von Martin H. (disjunction)


Lesenswert?

Dominik S. schrieb:
> D.h. mit 31 komme ich nicht aus, da mir eine Stelle fehlt, aber 32 geht
> ja nicht. Was also tun?

siehe oben 24 ist richtig

: Bearbeitet durch User
von Dominik S. (guitarking)


Lesenswert?

Martin H. schrieb:
> Dominik S. schrieb:
>> D.h. mit 31 komme ich nicht aus, da mir eine Stelle fehlt, aber 32 geht
>> ja nicht. Was also tun?
>
> siehe oben 24 ist richtig

Was meinst du mit 24 ist richtig?

von Martin H. (disjunction)


Lesenswert?

Dominik S. schrieb:
> Richtig. Mit double gehts nicht.

Wenn dan int oder long je nach Architektur

oder sowas

x4 = *((unsigned char*) &x) + 0;
x3 = *((unsigned char*) &x) + 1;
x2 = *((unsigned char*) &x) + 2;
x1 = *((unsigned char*) &x) + 3;

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Dominik S. schrieb:
> mit eurem Vorschlag jedoch (und dem ersetzten 8,16,31) komme ich auf
> 0.0.32.1

31?

8, 16, 24. Wieso 31?

von Martin H. (disjunction)


Lesenswert?

Dominik S. schrieb:
> Was meinst du mit 24 ist richtig?

8 + 8 = 16
16 + 8 = 24 nicht 31

von Dominik S. (guitarking)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Dominik S. schrieb:
>> mit eurem Vorschlag jedoch (und dem ersetzten 8,16,31) komme ich auf
>> 0.0.32.1
>
> 31?
>
> 8, 16, 24. Wieso 31?

Ach ja, ich Depp^^ Danke vielmals an alle, jetzt läufts!! :)

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.