Wie ist es möglich aus 2 Bytes ein Byte zu gewinnen, indem jedes zweite
Bit ausgelassen wird. Als Controller habe ich den ATTiny2313.
Kennt jemand einen schnellen Algorithmus?
Byte 0 Byte 2
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
Neues Byte
7 5 3 1 7 5 3 1
Wenn 256 Bytes Platz im Flash ist, kann man eine Tabelle verwenden:
neues_byte = (table[byte0] << 4) + table[byte2];
Das Schieben könnte man auch noch einsparen, wenn man nochmal 256 Bytes
Flash spendiert.
Wolfgang R. schrieb:> Der Lookup-Table verschlingt vermutlich mehr... ;-) Dafür ist er> deutlich schneller.
Man könnte ja noch auf Assembler umsteigen. Das obige Beispiel von Knut
werde ich mir auch noch ausprobieren.
Hallo,
ernsthafte Frage (ganz ohne Ironie):
Fridel, wofür soll das gut sein? Was kommt da heraus ausser das ein Byte
verschwindet - steckt da irgendeine clevere Logik dahinter?
mfg
C-Beginner
Yalu X. schrieb:> In C (mit AVR-Builtin __builtin_avr_insert_bits):
[...]
D.h.: Mit der doch recht speziellen Kenntnis einer einzigartigen
Besonderheit des AVR-GCC kann man in C immerhin (nicht ganz) die
Performance erreichen, die in Assembler möglich ist, wenn man einfach
nur die rund hundert simplen Instruktionen des AVR kennt und beherrscht
(statt der hunderte Seiten füllenden Details von C an sich und der
weitere hunderte Seiten füllenden Beschreibungen eines speziellen
Compilers bezogen auf ein spezielles Target-System)?
Außerdem: Sollten die angeblich doch so hocheffizent optimierenden
C-Compiler nicht einfach alleine herausfinden können, wann der Einsatz
der spezialisierten Macros sinnvoll wäre? Algorithmisch sehe ich da
jedenfalls kein Problem. Es muß also wohl daran liegen, dass die
Compiler doch nicht so gut sind, wie die C-Apologeten immer behaupten,
dass sie es wären...
> D.h.: Mit der doch recht speziellen Kenntnis einer einzigartigen> Besonderheit des AVR-GCC kann man in C immerhin (nicht ganz) die> Performance erreichen, ...
Deinem Beitrag entnehme ich, dass es in Assembler noch besser umzusetzen
ist (kürzer?, schneller?). Kannst du ein Programm posten?
Das von Knut Ballhause. Wenn man wie Yalu X. ein Quellbyte mit dem
Zielbyte überschreibt, dann kann man Byte0 durch Byte2 ersetzen, die
ersten beiden Zeilen weglassen, und ist bei 14 Takten.