Forum: PC-Programmierung Bitmanipulation zwischen zwei variablen nur wie?


von Florian (Gast)


Lesenswert?

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!

von Karl H. (kbuchegg)


Lesenswert?

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;

von Wolfgang B. (et-tutorials) Benutzerseite


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.