Bitweise Operatoren?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Bitweise Operatoren?

    Hi!

    Ich hab mal sowas von "bitweisen Operatoren" in C++ gelesen. Wie kann ich diese verwenden?

    Schonmal vielen Dank im Vraus!

    EDIT: Ok, hab schon was gefunden! Wens noch interessiert, sollte sich das mal durchlesen:

    Bitweise Operatoren
    C bietet bitweise Operatoren, die auf die binären Darstellungen ihrer Argumente operieren (das soll heißen, dass man die binären Darstellungen der beiden Operanden hinschreibt und dann bit für bit eine logische Operation ausführt):
    ^ - bitweises exklusiv-oder

    & - bitweises und
    | - bitweises oder
    ~ - bitweises nicht
    <<, >> - bitweises shift left und right
    Dabei heißt exklusiv-oder, dass im Ergebnis eine 1 steht, wenn entweder im einen oder im anderen Operanden eine 1 steht, sonst 0.

    Bei ”und“ steht im Ergebnis 1, wenn in beiden Operanden eine 1 ist, bei ”oder“, wenn in mindestens einem eine 1 ist.

    ”nicht“ macht aus jeder 1 eine 0 und umgekehrt - ”nicht“ ist natürlich kein zweistelliger Operator mehr, es hat nur einen Operanden.

    Die Schiebeoperationen schieben einfach alle bits nach rechts oder links. Das Schieben von vorzeichenbehafteten Zahlen sollte man in der Regel unterlassen, es sei denn, man versteht den Abschnitt 6.5.7 des ISO-C-Standards und weiß, warum die dort erwähnten undefinierten Werte undefiniert geblieben sind - Details gibt es auf Anfrage.

    Beispiele:

    Sei a=0xF2=111100102 und b=0x2E=001011102. Dann ist

    a&b= 001000102 =0x22
    a|b= 111111102 =0xFE
    a^b= 110111002 =0xDC
    ~a= 000011012 =0x0D
    a<<1= 1111001002 =0x1E4
    a>>1= 011110012 =0x79
    Diese bitweisen Operatoren existieren genau so in Python, werden dort aber nicht ganz so häufig verwendet.

    Wozu ist das alles überhaupt gut? Grundsätzlich immer, wenn Bits manipuliert werden müssen, etwa bei der Grafikverarbeitung.

    Ein anderer Anwendungsfall sind Mengen. In Python lassen sich Mengen recht einfach durch Dictionaries darstellen, C hat aber keine Dictionaries. Wenn die Mengen klein sind (sagen wir, nur 32 verschiedene Elemente haben können, was etwa bei nicht-ausschließenden Optionen von Programmen der Fall sein mag), lassen sie sich durch die bits in einem long darstellen.

    In Python geschrieben könnte das etwa so aussehen, wenn wir zunächst damit zufrieden sind, wirklich nur die Zahlen zwischen 0 und 31 in der Menge zu haben:

    class Set:

    def __init__(self, initMask=0):
    self.bitMask = initMask

    def __str__(self):
    return "{%s}"%(", ".join([str(i)
    for i in range(32) if (1<<i)&self.bitMask]))

    def addElement(self, elInd):
    self.bitMask <imgsrc="folienhtml5x.gif"alt=""class="bar">1<<elInd

    def delElement(self, elInd):
    self.bitMask &= ~(1<<elInd)

    def union(self, other):
    return Set(self.bitMask<imgsrc="cmtt10-c.gif"alt="|,"class="10x-x-c">.bitMask)

    def section(self, other):
    return Set(self.bitMask&other.bitMask)

    Wer will, kann die Klasse ja verbessern, z.B. um Fehlerprüfungen (die Elementnummern sollen ja beschränkt sein) oder auf eine einstellbare Anzahl von Elementen durch Verwendung einer geeigneten Liste von ganzen Zahlen. Mit Python-longs gehts natürlich auch ohne solche Tricks. Wer aber richtige Mengen in Python braucht, sollte wie gesagt entweder mit Dictionaries oder aber mit Extensionen wie etwa kjbuckets arbeiten.


    MFG
    Xe2X
  • Man kann einiges einfacher Erklären (denke ich):

    OR = Einschaltoperator - schaltet alle Bits eines Bitmusters, welche auf 1 gesetzt sind, ein, und lässt die anderen Bits wie sie waren ...
    110001 OR
    000100
    110101
    ¯¯¯¯¯¯
    egal was bei dem ersten Bitmuster an x-ter Stelle steht, die 3. Stelle wird durch die 2. Zahl in jedem Falle eingeschaltet.

    AND = Ausschaltoperator - schaltet alle Bits einer Bitmusters, welche auf 0 gesetzt sind, aus.

    XOR = Umschaltoperator ... Grundprinzip vieler Encryption Algorithmen, da für ein Zahlentripel a, b, c gilt:
    wenn A XOR B = C, dann ist C XOR B = A und C XOR A = B usw...

    Linksschieben und Rechtsschieben ist nichts anderes als eine andere Schreibweise für Zahl * 2^X bzw Zahl * 2^-X. (wenn man Zahl << x und Zahl >> x betrachtet)

    Danke für die Aufmerksamkeit, hope i helped.

    gruß mg-tx
  • Original geschrieben von Xe2X
    Hi!

    Wie ist das eigentlich... gibt es eine Möglichkeit einzelne Bits eines Bytes zu verändern, bzw, auslesen, ob diese auf 0 oder 1 gesetzt sind??

    MFG
    Xe2X


    jo klar z.B.:

    Quellcode

    1. if ((zahl&int(pow(2,m))) == int(pow(2,m))){...}
  • Hi!

    @ Coolman25

    Könntest du, oder auch evtl. jemand anderes, das genauer erklären?
    Ich versteh das noch nicht so richtig... was passiert hier denn?

    Schonmal vielen Dank im Voraus!

    MFG
    Xe2X