Hallo, ich will zwischen zwei Variablen Bits austauschen und habe dieses bis jetzt noch nicht geschafft. Ein Beispiel: Ich habe die Variable a und b aus Variable a will ich dann bit0 in bit5 der variable b kopieren. Dies können natürlich auch Ports sein Bit 5 von PINB zu Bit 2 PORTB. Eine Möglichkeit wäre dies über if Bedingungen zu lösen, indem man beispielsweise das 2 Bit in PINB überprüft und dann bei PORTB Bit 2 setzt oder nicht. Dies ist mir aber zu umständlich, deswegen möchte ich das Problem gerne mit Zuweisungsoperatoren lösen. Danke im Voraus!
Florian schrieb: > Ich habe die Variable a und b aus Variable a will ich dann bit0 in bit5 > der variable b kopieren.
1 | b &= ~( 1 << BIT_5 ); |
2 | b |= ( ( a >> BIT_0 ) & 0x01 ) << BIT_5; |
mit einer Abfrage könnte es allerdings schneller sein. Müsste man den Assembler Code studieren
1 | b &= ~( 1 << BIT_5 ); |
2 | b |= ( a & ( 1 << BIT_0 ) ) ? 1 << BIT_5 : 0; |
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.
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.