Bitmanipulation automatisieren

Gast #2710936
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.
#2710939
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
}
#2713764
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren