Was macht dieser C-Ausschnitt?

Hallo zusammen.

Ich versuche hier grade ein C-Programm auseinanderzunehmen…

Doch ich verstehe einfach nicht was dieser Ausschnitt hier macht:

tmpL = 100 * (byte & 0x0F) ;
tmpL = tmpL + (10 * (byte2 >> 4)) + (byte2 & 0x0F) ;

wenn byte=224 ist und byte2=17 müsste tmpL 11 werden.

könnte mir jemand sagen wie ich das rechnerisch lösen könnte also z.b.

tmpL=byte + byte2 % 256

oder etwas ähnliches?

Hallo Codefetch,

die Klammer im ersten Statement ist eine Modulo 16-Funktion, die erste Klammer im zweiten Statement teilt die Zahl ohne Rest durch 16 und die zweite Klammer ist identisch mit der ersten Klammer im ersten Statement.

224 = 0b11100000 -\> (byte & 0x0F) = 0
 17 = 0b00010001 -\> (byte \>\> 4) = 1
 -\> (byte & 0x0F) = 1

Man könnte auch 100*(byte&0x0f)+10*((byte2&0xf0)/16)+(byte2&0x0f) schreiben (das ist aber wesentlich langsamer.

MfG Georg V.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo!

die erste Klammer im zweiten Statement teilt die Zahl ohne
Rest durch 16

So allgemeingültig ist das nur wenn byte unsigned (vorzeichenlos) ist.

Gruß
Stefan

Hallo.

Nur als Ergänzung:

tmpL = 100 * (byte & 0x0F) ;
tmpL = tmpL + (10 * (byte2 >> 4)) + (byte2 & 0x0F) ;

Das sieht aus wie die Umrechnung einer BCD-Zahl in eine Dezimalzahl. Die BCD-Zahl hat 3 Stellen und ist in byte und byte2 gespeichert.
Beim BCD-Code stehen jeweils 4 Bit für eine Ziffer (0000 = 0 bis 1001 = 9. Alle weiteren Binärdarstellungen sind ungültig für BCD).

Im genannten Fall wären die niederwertigen 4 Bits von byte die erste Stelle der Zahl, die höherwertigen 4 Bits von byte2 für die zweite Stelle usw.

Wenn man sich byte und byte2 in Hex-Schreibweise anschaut, kann man die Dezimalzahl auch direkt ablesen:
byte = 224 = E 0 16
byte2 = 17 = 11 16

Die Dezimalzahl wäre also 011.

Sebastian.

Wenn man sich byte und byte2 in Hex-Schreibweise anschaut,
kann man die Dezimalzahl auch direkt ablesen:
byte = 224 = E 0 16
byte2 = 17 = 11 16

Die Dezimalzahl wäre also 011.

Könnte ich dann nicht einfach sagen

tmpL=100\*LowByte(byte)+10\*HighByte(byte2)+LowByte(byte2)

??

Gruss
CodeFetch

Hallo.

Wenn man sich byte und byte2 in Hex-Schreibweise anschaut,
kann man die Dezimalzahl auch direkt ablesen:
byte = 224 = E 0 16
byte2 = 17 = 11 16

Die Dezimalzahl wäre also 011.

Könnte ich dann nicht einfach sagen

tmpL=100*LowByte(byte)+10*HighByte(byte2)+LowByte(byte2)

Wenn LowByte(x) dir den Wert der niederwertigen 4 Bits von x liefert und HighByte(x) den Wert der höherwertigen 4 Bits, dann ginge das.
Genaugenommen sollte man die Funktionen dann LowNibble und HighNibble nennen. Ein Nibble ist die Hälfte eines Bytes.

Man könnte den gegebenen Ausdruck

tmpL = 100 \* (byte & 0x0F);
tmpL = tmpL + (10 \* (byte2 \>\> 4)) + (byte2 & 0x0F);

auch als einzelne Zuweisung schreiben. Das sähe dann so aus:

tmpL = 100 \* (byte & 0x0F) + 10 \* (byte2 \>\> 4) + (byte2 & 0x0F);

Deine Funktion LowByte(x) müsste also (x & 0x0F) ermitteln und HighByte(x) eben (x >> 4).
Die Erklärung dahinter ist, dass das bitweise Ver-und-en mit 0x0F die höherwertigen 4 Bits auf 0 setzt und somit die niederwertigen 4 Bits übrigbleiben.
Für die höherwertigen Bits kann man das nicht genauso machen. Man kann zwar die niederwertigen Bits ausmaskieren durch Ver-und-en mit 0xF0, aber dann hat man da noch den Faktor 24 drin. Den Faktor bekommt man weg durch das Verschieben um 4 Bits. Da dabei aber eh die niederwertigen 4 Bits verschwinden, kann man auch direkt Schieben, ohne erst die Bits auf 0 zu setzen.

Sebastian.

Wenn LowByte(x) dir den Wert der niederwertigen 4 Bits von x
liefert und HighByte(x) den Wert der höherwertigen 4 Bits,
dann ginge das.
Genaugenommen sollte man die Funktionen dann LowNibble und
HighNibble nennen. Ein Nibble ist die Hälfte eines Bytes.

Jaja ich weiß XD ich hatte das hier falsch übernommen…
Meine beiden Funktionen heißen eigentlich GetHighNibble() und GetLowNibble()… HighByte() und LowByte() hatte ich eigentlich geschrieben um das Highbyte und Lowbyte von einem Word zu ermitteln. Da bin ich ein bisschen durcheinander gekommen.

Vieeelen Dank an Alle, die geholfen haben…

Gruß
CodeFetch