Noob schrieb:
> Aber das muss doch irgendwie in einem Schritt gehen!
Nein. Auch wenn du einen komplexen Ausdruck in C in einer Zeile
schreiben kannst, werden es dadurch nicht weniger "Schritte". Die
if-Konstruktion ist schon garnicht schlecht, der Compiler kann die recht
gut optimieren.
Wenn du die unbedingt in eine Zeile quetschen willst, wazu auch immer
das gut sein soll, kannst du sie ja auch so schreiben:
(var_new&(1<<0))? var_old |= (1<<0): var_old &= ~(1<<0);
Auf'm AVR8 kommt dann vermutlich sowas raus:
sbrc reg_new,0
ori reg_old,1
sbrs reg_new,0
andi reg_old,~1
was mit vier Takten schon nicht schlecht ist. Vielleicht schafft der
Compiler aber sogar das Optimimum
bst reg_new,0
bld reg_old,0
Aber auch das sind immer noch ZWEI Schritte, also zwei Takte. In einem
Schritt ist das Problem schlicht nicht lösbar. Jedenfalls nicht auf
einem AVR8.
Bei den anderen Vorschlägen im Thread wird mit einiger
Wahrscheinlichkeit etwas herauskommen, was weniger effizienten Code
erzeugt. Irgendwas in der Art:
andi reg_old,~1
andi reg_new,1
or reg_old,reg_new
Merke: Was du in C hinschreibst, interessiert den Gasmann. Wichtig ist
letztlich, was der Compiler draus macht. Auf C-Ebene sollte es vor allem
eins sein: gut lesbar. Und dafür ist es NICHT hilfreich, soviel wie
möglich in eine Zeile zu quetschen. Und davon wird der erzeugte Code
typischerweise auch weder schneller noch kleiner. Also: kompletter
Unsinn, hier zu "optimieren".