www.mikrocontroller.net

Forum: GCC Bitmanipulation automatisieren


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Stefanie (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Frank K. (fchk)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
static const unsigned char lut2x[16]=
{ 0x00,0x03,0x0c,0x0f,
  0x30,0x33,0x3c,0x3f,
  0xc0,0xc3,0xcc,0xcf,
  0xf0,0xf3,0xfc,0xff
};

void byte2x(unsigned char in, unsigned char* outh, unsigned char* outl)
{
  *outh=lut2x[in>>4];
  *outl=lut2x[in&15];
}

Beitrag #2710942 wurde von einem Moderator gelöscht.
Autor: Falk Brunner (falk)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

uint16_t j;
uint8_t i;

j=0;
if (i & 0x01) j|= 0x0003;
if (i & 0x02) j|= 0x000C;
if (i & 0x04) j|= 0x0030;
if (i & 0x08) j|= 0x00C0;
if (i & 0x10) j|= 0x0300;
if (i & 0x20) j|= 0x0C00;
if (i & 0x40) j|= 0x3000;
if (i & 0x80) j|= 0xC000;

Sollte auch recht schnell sein, auch auf nem AVR. Kompakter aber etwas 
langsamer ist eine Schleife.

uint16_t j, k;
uint8_t i;

for (j=0, k=3; k !=0; k<<=2, i>>=1) {
  if (i & 0x01) j|=k;
}  

@ Frank K. (fchk)

Das ist glaube ich nicht, was der OP will.

Autor: Stefan Ernst (sternst)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hmm, stimmt, war etwas blind 8-0

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net