Bitmanipulation automatisieren

Gast #2710936
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
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
@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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.