Hallo, wie kann ich automatisch ein Byte auf 2 Bytes verdoppeln, indem ich jedes Bit nochmals kopiere. Z.B. Ausgangsbyte: 0100 1101 Verdoppelt 00110000 11110011 Kann mir wer sagen, wie ich das am geschicktesten Hinkriege (über einen Algorithmus). Meine Lösung wäre nur die einzelnen Bits anzusprechen und in 2 Bytes zu stecken.
1 | static const unsigned char lut2x[16]= |
2 | { 0x00,0x03,0x0c,0x0f, |
3 | 0x30,0x33,0x3c,0x3f, |
4 | 0xc0,0xc3,0xcc,0xcf, |
5 | 0xf0,0xf3,0xfc,0xff |
6 | }; |
7 | |
8 | void byte2x(unsigned char in, unsigned char* outh, unsigned char* outl) |
9 | { |
10 | *outh=lut2x[in>>4]; |
11 | *outl=lut2x[in&15]; |
12 | } |
@Stefanie (Gast) >wie kann ich automatisch ein Byte auf 2 Bytes verdoppeln, indem ich >jedes Bit nochmals kopiere. >Z.B. >Ausgangsbyte: >0100 1101 >Verdoppelt >00110000 11110011 Naja, verdoppeln ist das nicht unbedingt. >Kann mir wer sagen, wie ich das am geschicktesten Hinkriege (über einen >Algorithmus). Meine Lösung wäre nur die einzelnen Bits anzusprechen und >in 2 Bytes zu stecken. Eine von vielen möglichen Lösungen. Soll es schnell oder speichersparend sein? Sehr schnell ist eine Tabelle aus 256 Einträgen a 16 Bit. data_doppelt = tabelle[data_einfach]. Die Tabelle kann man entweder vorher per Excel oder was auch immer berechnen oder am Programmstart füllen. Diesen Füllalgorithmus kann man auch allein zur Berechnung nutzen, ist zwar langsamer aber ggf. platzsparender.
1 | uint16_t j; |
2 | uint8_t i; |
3 | |
4 | j=0; |
5 | if (i & 0x01) j|= 0x0003; |
6 | if (i & 0x02) j|= 0x000C; |
7 | if (i & 0x04) j|= 0x0030; |
8 | if (i & 0x08) j|= 0x00C0; |
9 | if (i & 0x10) j|= 0x0300; |
10 | if (i & 0x20) j|= 0x0C00; |
11 | if (i & 0x40) j|= 0x3000; |
12 | if (i & 0x80) j|= 0xC000; |
Sollte auch recht schnell sein, auch auf nem AVR. Kompakter aber etwas langsamer ist eine Schleife.
1 | uint16_t j, k; |
2 | uint8_t i; |
3 | |
4 | for (j=0, k=3; k !=0; k<<=2, i>>=1) { |
5 | if (i & 0x01) j|=k; |
6 | }
|
@ Frank K. (fchk) Das ist glaube ich nicht, was der OP will.
Falk Brunner schrieb: > @ Frank K. (fchk) > > Das ist glaube ich nicht, was der OP will. Ist doch das Gleiche wie deines, nur mit einer Nibble-LUT.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.