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.
a ∧
b in der Logik bedeutet "sowohl
a als auch
b" und
a ∩
b in der Mengenlehre bedeutet "die Menge der Elemente die sowohl in
a als auch in
b vorkommen". Analog dazu bedeutet
a ∨
b "
a oder
b oder beides" und
a ∪
b "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.
In specifications, Murphy's Law supersedes Ohm's.