Bit Manipulationene

Gast #167912
Hallo
~~~~~

Ich hoffe es kann mir jemand helfen.
Ich komme mit Bit Manipulationen an so einer Typumwandlung nicht ganz
klar.
Kann mir an Hand dieses Beispiels jemand erklären, wie es
funktioniert?

uInteger = 0xFFFF;

ucChar1((unsigned char)(uInteger>>8));
ucChar2((unsigned char)uInteger);

Danke.
Gast
Mal angenommen...

unsigned int uInteger;
unsigned char ucChar1, ucChar2;

dann ...

uInteger = 0xFFFF;

ucChar1 = (unsigned char)(uInteger>>8);
ucChar2 = (unsigned char)uInteger;

Wo ist das Problem?
Gast
kurze c einführung:
-also "int" hat 2 Bytes, "char" hat 1 Byte.
-"unsigned" sagt dass es eine vorzeichenlose variable ist
-ein cast "interpretiert" den wert nicht, sondern nimmt den inhalt,
der an der adresse steht und "denkt" es sei der typ, der bei mcast
angegeben wurde.
- x >> n bedeutet, dass x um n stellen nach rechts geschoben (nicht
rotiert!) wird.

nun zum Beispiel oben:

uInteger scheint ein unsigned int zu sein.
zu ucChar1 (von innen nach außen): uInteger um 8 Stellen nach rechts
schieben (also das letzte Byte/letzten beiden Hex-Stellen streichen)
und dann als ein byte behandeln
zu ucChar2: den wert von uInteger als ein byte (unsigned char)
betrachten (das vordere byte streichen).

Für die Bit-Manipulation kannst du dir einfach folgendes merken:
x |=  (1 << n)    "oder ist": setze bit n in variable x
x &= ~(1 << n)    "und ist" mit komplement ("~"): lösche bit n in
variable x
x ^=  (1 << n)    "xor ist": schalte bit n in variable x um (in den
entgegengesetzten zustand)
x & (1 << n)     test, ob bit n in variable x gesetzt


also nun ein beispiel:
~(   0101 1010)   (0x5A)
=    1010 0101   (0xA5)

     0101 1010   (0x5A)
|=   0010 0000   (1 << 5) = (0x20)
---------------
     0111 1010

     0101 1010   (0x5A)
&=   0000 1000   (1 << 3) = (0x04)
--------------
     0000 1000

     0101 1010   (0x5A)
&=   1110 1111   ~(1 << 4) = (0xef)
--------------
     0100 1010

     0101 1010   (0x5A)
^=   1000 0000   (1 << 7) = (0x80)
--------------
     1101 1010

     1101 1010
^=   1000 0000   (1 << 7) = (0x80)
--------------
     0101 1010
Gast
das ist mir schon klar, aber ein 4 byte oder 8 byte (wie es mal für die
64bit prozessoren angedacht war - aber nicht gemacht wurde) int auf
einem microcontroller ist recht unwahrscheinlich...

Oder hier ist einer Selbstmordgefährtet und fängt gleich mit 32 bit
microcontrollern an... ;)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.