www.mikrocontroller.net

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


Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Florian schrieb:

> Ich habe die Variable a und b aus Variable a will ich dann bit0 in bit5
> der variable b kopieren.
  b &= ~( 1 << BIT_5 );
  b |= ( ( a >> BIT_0 ) & 0x01 ) << BIT_5;

mit einer Abfrage könnte es allerdings schneller sein. Müsste man den 
Assembler Code studieren
  b &= ~( 1 << BIT_5 );
  b |=  ( a & ( 1 << BIT_0 ) ) ? 1 << BIT_5 : 0;

Autor: Wolfgang Bengfort (et-tutorials) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?
  if( a & ( 1 << BIT_0 ) )
    b |= ( 1 << BIT_5 );
  else
    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
#define TRANSFER_BIT( From, FromBit, To, ToBit )        \
                      if( (From) & ( 1 << (FromBit) ) ) \
                        (To) |= ( 1 << (ToBit) );       \
                      else                              \
                        (To) &= ~( 1 << (ToBit) );
 
int main()
{
  TRANSFER_BIT( PINB, PB0, PORTA, PA5 );
  TRANSFER_BIT( PINB, PB3, PORTA, PA2 );

  ...

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
  b &= ~( 1 << BIT_5 );
  if( a & ( 1 << BIT_0 ) )
    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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.