Forum: Compiler & IDEs Bitmanipulation automatisieren


von Stefanie (Gast)


Lesenswert?

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.

von Frank K. (fchk)


Lesenswert?

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
}

von Falk B. (falk)


Lesenswert?

@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.

von Stefan E. (sternst)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

Hmm, stimmt, war etwas blind 8-0

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.