Seite 1 von 1

Verständnisfrage zu Bitweiser-Operatoren

Verfasst: Mittwoch 22. April 2026, 10:36
von Dennis89
Hallo zusammen,

bei mir tauchen immer wieder Fragen auf, wenn es um Bitweiser-Operatoren geht.
Wenn ich zum Beispiel folgendes ausführe, erhalte ich ein Ergebnis, das ich nur bedingt erwarte:

Code: Alles auswählen

>>>set([1, 2, 3, 4]) & set([7, 3, 6, 1])
{1, 3}
An sich erwarte ich schon, dass die 1 und die 3 geliefert werden. Allerdings frage ich mich, wie läuft der Prozess dahinter ab, bis die Bits, bildlich gesprochen, übereinander stehen und kombiniert werden können? Weil wenn ich jetzt jede Zahl in der geschriebenen Reihenfolge in Binär übersetze und die zwei Mengen untereinander schreibe, dann steht die 1 nicht unter der 1, sondern unter der 4. Ich habe dann sowas:

Code: Alles auswählen

0b1, 0b10, 0b11, 0b100
0b111, 0b11, 0b110, 0b1
Werden die Werte vor so einem Vergleich immer erst sortiert? Aufsteigend? Und wie ist das bei Strings?

Code: Alles auswählen

>>>set("a4bc") & set("cgb4")
{'c', 'b', '4'}
Zusammengefasst interessiert mich, was passiert intern, bis es zur Verknüpfung zu den Bits kommt?

Ich bin euch sehr dankbar für jede Antwort. Macht euch aber bitte nicht die Mühe, die Frage in ChatGPT zu tippen und die Antwort zu posten. Ich frage und bitte bewusst um menschliches Wissen.

Grüße
Dennis

Re: Verständnisfrage zu Bitweiser-Operatoren

Verfasst: Mittwoch 22. April 2026, 11:43
von snafu
Wie kommst du darauf, dass bei Sets bitweise Operationen zur Anwendung kommen? Wenn du in der Shell zwei Aufrufe mit einer Pipe verknüpfst, dann wird intern ja auch kein bitweises Oder auf die Rückgabewerte angewendet.

Re: Verständnisfrage zu Bitweiser-Operatoren

Verfasst: Mittwoch 22. April 2026, 12:25
von pillmuncher
Deine Verwirrung kommt daher, dass du ein unzutreffendes mentales Bild davon hast, was & und | bedeuten. Genauer gesagt, dass du ihre Anwendung auf Bitketten als fundamental anzusehen scheinst. Es gibt hier keine fundamentale Bedeutung, sondern nur strukturell ähnliche Verwendungsweisen in unterschiedlichen mathematischen Gebieten.

Tatsächlich sind & und | zunächst nur andere symbolische Namen für die logischen Operatoren∧und∨. Die Boolesche Algebra, auf der Bitketten-Berechnungen beruhen, bildet einen vollständingen Verband. ∧und∨ sind dabei die sog. join und meet Operatoren. Mengen bilden ebenfalls einen solchen vollständingen Verband. Die Operatoren aus der Mengenlehre sind der Vereinigungsoperator ∪ und der Schnittmengenoperator ∩. Die visuelle Ähnlichkeit zwischen ∩ und ∧auf der einen, und ∪ und ∨ auf der anderen Seite sind nicht zufällig gewählt. ab in der Logik bedeutet "sowohl a als auch b" und ab in der Mengenlehre bedeutet "die Menge der Elemente die sowohl in a als auch in b vorkommen". Analog dazu bedeutet ab "a oder b oder beides" und ab "die Menge der Elemente die in a oder b oder beiden vorkommen".

Wenn man die Namen ∧und∨ durch & und | ersetzt und auf ein einzelnes Paar von Bits anwendet, dann bekommt man zwei Wahrheitstabellen:

Code: Alles auswählen

A B | A & B
----+------
0 0 |   0
0 1 |   0
1 0 |   0
1 1 |   1

A B | A | B
----+------
0 0 |   0
0 1 |   1
1 0 |   1
1 1 |   1
Wenn man logische Operatoren verwendet, dann sieht das so aus:

Code: Alles auswählen

P Q | P ∧ Q
----+-------
⊥ ⊥ |   ⊥
⊥ ⊤ |   ⊥
⊤ ⊥ |   ⊥
⊤ ⊤ |   ⊤

P Q | P ∨ Q
----+-------
⊥ ⊥ |   ⊥
⊥ ⊤ |   ⊤
⊤ ⊥ |   ⊤
⊤ ⊤ |   ⊤
Die typographischen Namen für ⊤ und ⊥ sind Down Tack und Up Tack, in der Logik True und False oder Verum und Falsum, in der Verbandstheorie Top und Bottom, und in der Ordnungstheorie (Verbände sind Ordnungen) Supremum und Infimum.

Wie kommt man nun zu den Operationen auf Bitketten? Das ist einfach die paarweise Anwendung derselben Operation auf zwei "zipped" Bitketten:

Code: Alles auswählen

  0b101 
& 0b110
-------
  0b100 

  0b101 
| 0b110
-------
  0b111
Wenn die Bitketten Python-Listen wären, könnte man schreiben:

Code: Alles auswählen

>>> [a & b for a, b in zip([1, 0, 1], [1, 1, 0])]
[1, 0, 0]
>>> [a | b for a, b in zip([1, 0, 1], [1, 1, 0])]
[1, 1, 1]
Das lässt sich nicht eins zu eins auf die Mengenlehre übertragen, weil Elemente in einer Menge nicht ordinal geordnet sind. Man kann von einer Menge Zahlen sagen, dass es eine kleinste oder größte gibt, oder dass von zwei Zahlen eine größer oder kleiner als die andere ist, aber es gibt keine "erste" oder "letzte" oder "mittlere" Zahl, weswegen man zip hier nicht einfach so anwenden kann. Statt dessen bildet Python eine neue Menge, die alle Elemente beider Mengen enthält, oder testet welche Elemente in beiden Mengen vorkommen und bildet daraus dann eine neue Menge.


Disclaimer: Ja, die Tabellen habe ich von ChatGPT zeichnen lassen, weil ich zu faul war, das selbst zu tun. Alles andere ist von mir.

Re: Verständnisfrage zu Bitweiser-Operatoren

Verfasst: Mittwoch 22. April 2026, 14:36
von snafu
@Dennis89: Hier findet man übrigens die passende Stelle in der Doku zu den verschiedenen Set-Operationen:

https://docs.python.org/3/library/stdtypes.html#set

Es werden immer zuerst die ausgeschriebenen Methodennamen genannt und direkt darunter der Operator, der jeweils als Alias dafür verwendet wird. Anschließend erfolgt die Beschreibung der Methode. Niemand spricht dort von bitweisen Operationen.

Ich würde die Zeichen auch anders als du in erster Linie als logische Operatoren ansehen. Die bitweisen Operatoren sind einfach ein Spezialfall davon, auch wenn dir vielleicht bisher keine andere Verwendung begegnet ist. Es sind in dem Sinne ja ebenso logische Operationen, nur dass die auf jedes einzelne Bit angewendet werden, wie ja bereits anschaulich erklärt wurde.