A&B = C, wobei alle Bits, die in C gesetzt sind, sowohl in A als auch in B gesetzt sind.
Entweder A-C = D oder B-C = E setzt nur diese gemeinsamen Bits auf 0. Es gibt keinen Übertragseffekt, da 1-1=0.
D+B oder E+A ist ähnlich wie A+B, mit dem Unterschied, dass durch die vorherige Subtraktion von A&B kein Übertrag entsteht, da alle gemeinsam gesetzten Bits in D oder E gelöscht wurden.
Das Endergebnis ist, dass A-A&B+B oder B-A&B+A äquivalent zu A|B ist.
Hier ist eine Wahrheitstabelle, falls das immer noch verwirrend ist:
A | B | OR A | B | & A | B | - A | B | +
---+---+---- ---+---+--- ---+---+--- ---+---+---
0 | 0 | 0 0 | 0 | 0 0 | 0 | 0 0 | 0 | 0
0 | 1 | 1 0 | 1 | 0 0 | 1 | 0-1 0 | 1 | 1
1 | 0 | 1 1 | 0 | 0 1 | 0 | 1 1 | 0 | 1
1 | 1 | 1 1 | 1 | 1 1 | 1 | 0 1 | 1 | 1+1
Beachten Sie die Übertragszeilen in den + und - Operationen, die wir vermeiden, weil A-(A&B) die Fälle festlegt, in denen beide Bits in A und B 1 bis 0 in A sind, dann bringt das Zurückaddieren von B auch die anderen Fälle, in denen es eine 1 entweder in A oder B gab, aber nicht, wo beide 0 hatten, so dass die OR Wahrheitstabelle und die A-(A&B)+B Wahrheitstabelle identisch sind.
Eine andere Möglichkeit, es zu sehen, ist, dass A+B fast wie A|B ist, außer dem Übertrag in der unteren Zeile. A&B isoliert diese untere Zeile für uns, A-A&B verschiebt diese isolierten Cases in der +Tabelle um zwei Zeilen nach oben, und (A-A&B)+B wird äquivalent zu A|B.
Man könnte dies in A+B-(A&B) umwandeln, aber ich hatte Angst vor einem möglichen Überlauf, aber das war wohl ungerechtfertigt:
#include <stdio.h>
int main(){ unsigned int a=0xC0000000, b=0xA0000000;
printf("%x %x %x %x\n",a, b, a|b, a&b);
printf("%x %x %x %x\n",a+b, a-(a&b), a-(a&b)+b, a+b-(a&b)); }
c0000000 a0000000 e0000000 80000000
60000000 40000000 e0000000 e0000000
bearbeiten : Ich habe das also geschrieben, bevor es Antworten gab, dann gab es eine 2-stündige Unterbrechung meiner Heimverbindung, und ich habe es schließlich geschafft, es zu posten, und habe erst danach bemerkt, dass es bereits zweimal richtig beantwortet wurde. Ich persönlich ziehe es vor, mich auf eine Wahrheitstabelle zu beziehen, um bitweise Operationen auszuarbeiten, also lasse ich es hier, falls es jemandem hilft.