Wolfgang Bengfort schrieb:
> Hallo Florian,
> wenn Dir die Lösung von Karl Heinz Buchegger noch etwas zu anspruchsvoll
> ist, könnte Dir vorweg mein Grundlagen-Video vielleicht helfen:
> http://et-tutorials.de/1908/bitweise-manipulation/
> Anschließend dann die Profi-Lösung von K.-H. Buchegger.
LOL
Weißt du, wie ich dieses Problem lösen würde.
Ganz ehrlich?
1 | if( a & ( 1 << BIT_0 ) )
|
2 | b |= ( 1 << BIT_5 );
|
3 | else
|
4 | b &= ~( 1 << BIT_5 );
|
obiges ist mir nämlich zu trickreich um in Produktionscode eingesetzt zu
werden :-)
Wenn so was im Code öfter vorkommt und ich tippfaul bin
1 | #define TRANSFER_BIT( From, FromBit, To, ToBit ) \
|
2 | if( (From) & ( 1 << (FromBit) ) ) \
|
3 | (To) |= ( 1 << (ToBit) ); \
|
4 | else \
|
5 | (To) &= ~( 1 << (ToBit) );
|
6 |
|
7 | int main()
|
8 | {
|
9 | TRANSFER_BIT( PINB, PB0, PORTA, PA5 );
|
10 | TRANSFER_BIT( PINB, PB3, PORTA, PA2 );
|
11 |
|
12 | ...
|
Auch einer Verpackung als static inline Funktion wäre ich nicht
abgeneigt. Aber auf keinen Fall den komplexen Ausdruck von da weiter
oben. Da müsste ich jedesmal beim Lesen 30 Sekunden darüber nachdenken,
was da passiert und ob das alles richtig ist. Und dazu bin ich zu faul
:-)
Eventuell, wenn sich im Assemblercode rausstellt, das das schneller geht
/ kürzer ist, würde ich auch
1 | b &= ~( 1 << BIT_5 );
|
2 | if( a & ( 1 << BIT_0 ) )
|
3 | b |= ( 1 << BIT_5 );
|
zu meinen Favoriten zählen. Ich denke, speziell diese Form kann der
Compiler nämlich im Falle von Port Zugriffen wunderbar auf nur 3
Assembler Instruktionen runterbrechen. Und so wie ich den gcc
einschätze, tut er das auch.