![]() |
Grundlegende C Frage !
ich habe 2 8bit register
a = xxxxxxxx b = yyyyyyyy ich möchte die beiden register in ein 16bit register schreiben nach folgenden muster c = xxxxxxxxyyyyyyyy wie mache ich das am einfachsten ? |
c = (a << 8) ¦ b
|
könntest du die funktion des codes kurz erklären ?
|
ganz einfach: du shiftest die 8 bits von x um 8 stellen nach links, dann steht da
xxxxxxxx00000000 und dann machst du ein bitweises oder mit 00000000yyyyyyyy |
danke für die rasche antwort und erklärung !
eine frage habe ich allerdigs noch ! ich habe eine zahl nach folgenden format ergebniss = 189,6583454596; wie kann ich einfachsten lösen das ich die Ziffern der Zahl einzeln habe ! am schluss hätte ich gern h = 1; z = 8; e = 9; n = 6; m = 5; |
h = ergebnis / 100;
z = ergebnis - (h * 100); e = ergebnis - (h * 100 - (z * 10)); ... wobei h, z und e vom typ long sind. so sollts funktionieren |
funktinoiert nicht ganz so, weil du für z bei zb 345 45 rauskriegst, nicht 4, du hast das /10 vergessen in der zweiten zeile.
andere version wär zb: t = zahl % 10000 / 1000; h = zahl % 1000 / 100; z = zahl % 100 / 10; e = zahl % 10; kannst hübsch in eine schleife verpacken auch. |
war ein schlampigkeitsfehler von mir. danke für den hinweis!
|
Zitat:
Annahme c ist ein unsigned int, a und b sind unsigned chars c =(((unsigned int)a) << 8) | (unsigned int)b; Schaut jetzt vielleicht etwas komplizierter aus, aber was ich schon mit "simplen" Shiftoperationen erlebt habe.... mfG Clystron |
Re: Grundlegende C Frage !
Zitat:
wie kann ich das umgekehrt realisieren ? ich habe ein 16Bit register c und möchte es in 2 8Bit register teilen ! |
genauso im prinzip
register a = (0xFF00 & 16bit register) >> 8; register b = 0xFF & 16bit register; |
Zitat:
register a = 16bit register >> 8; Da nicht rotiert wird - sondern geshiftet - fällt alles von den unteren 8 Bits weg und die oberen 8 Bits werden durch das Verschieben um 8 Stellen nach rechts zu den unteren 8 Bits, tja so einfach geht es. mfg Kikakater |
@kikakater:
Zitat:
Um auf Nummer sicher zu gehen und sich nicht um signed/unsigned kümmern zu müssen: register a = (16bit register >> 8 ) & 0xFF; |
Du widersprichst Dir selbst. Ein Register ist standardmäßig unsigned.
int Variablen sind je nach Compilerimplemenation short (16bit) bzw. long (32bit). Außderdem nehmen die meisten Compiler einen int (Datentyp) als signed int an. Wenn ich nun einen hohen 16bit Wert (Highbyte), der negativ ist, um 8 Bits nach rechts shifte, ist die einzige richtige Lösung, die Variable mit (unsigned int) umzutypisieren/=zu casten. |
Zitat:
Signed oder Unsigned ist reine Interpretationssache, der Inhalt der Speicherstelle schaut immer gleich aus. Ein Int ist immer so breit wie ein Register des Prozessors auf den compiliert wird, mindestens aber 16Bit. Auf einem 8Bitter also 16Bit, auf einem 16Bitter 16Bit, auf einem 32Bitter 32Bit und auf einem 64Bitter 64Bit. Das macht die Ints ja so "interessant"... <OT> Was machst du aber wenns wie bei Java keine unsigned-type gibt? </OT> mfG Clystron |
Halleluja rufen, denn unsigend ints sind eine Geschmackverirrung in Zeiten von 64bit.
unsigned ints sind grundsätzlich abzulehnen ... Bei verschiedenen engen Nummernkreisen machen sie einen Sinn, sonst sind sie jedoch eine Quelle für viele Programmfehler. |
Zitat:
|
Deswegen habe ich auch gemeint, daß man vor dem Verschieben einen Cast durchführen muß um portabel zu sein, respektive damit der Code portabel ist.
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 07:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag