Frage

Ich bin verwirrt, wenn ich Boolesche vs Bitoperatoren verwenden sollte,

  • and vs &
  • or vs |

Könnte jemand mich aufklären, wann verwende ich jeden und wenn man über die andere wird mit Auswirkungen auf meine Ergebnisse?

War es hilfreich?

Lösung

Hier sind ein paar Richtlinien:

  • sind Boolesche Operatoren in der Regel verwendet, auf boolean Werte aber bitweise Operatoren sind in der Regel verwendet, integer Werte.
  • Boolesche Operatoren sind Kurzschließen aber bitweise Operatoren sind nicht Kurzschlüsse.

Der Kurzschlussverhalten ist nützlich in Ausdrücken wie folgt aus:

if x is not None and x.foo == 42:
    # ...

Das wäre nicht richtig mit dem bitweise & Operator arbeiten, weil beide Seiten immer bewertet werden würden, AttributeError: 'NoneType' object has no attribute 'foo' geben. Wenn Sie die Boolesche andoperator der zweite Ausdruck verwenden wird nicht ausgewertet, wenn der erste falsch ist. Ebenso or wertet nicht das zweite Argument, wenn die ersten Wahr ist.

Andere Tipps

In der Theorie and und or kommen direkt aus der Booleschen Logik (und damit arbeiten auf zwei booleans einen boolean zu erzeugen), während & und | die boolean und / oder zu den einzelnen Bits der ganzen Zahlen gelten. Es gibt viele viele Fragen hier, wie diese Arbeit genau.

Hier sind praktische Unterschiede, die möglicherweise Ihre Ergebnisse beeinflussen:

  1. and und or Kurzschluss, das heißt True or sys.exit(1) wird nicht beendet, weil für einen bestimmten Wert (True or ..., False and ...) des ersten Operanden, die zweite würde das Ergebnis nicht ändern = muss nicht ausgewertet werden. Aber | und & nicht kurzschließen - True | sys.exit(1) führt Sie outta der REPL
  2. .
  3. (Gilt nur für einige Sprachen mit Überladen von Operatoren, einschließlich Python :) & und | sind regelmäßige Betreiber und können überlastet werden - and und or werden in die Sprache geschmiedet (obwohl zumindest in Python, die spezielle Methode für Zwang boolean können Nebenwirkungen haben).
  4. (gilt nur für einige Sprachen [siehe KennyTM Kommentar] :) and und or return (immer? Nie wirklich verstehen, noch habe ich es brauchen), um den Wert eines Operanden statt True oder False. Dies gilt nicht die Bedeutung von Booleschen Ausdrücken in Bedingungen ändern - 1 or True ist 1, aber 1 ist auch wahr. Aber es wurde einmal verwendet (seit einigen Jahren cond ? true_val : false_val in C-Syntax, true_val if cond else false_val in Python) einen bedingten Operator zu emulieren. Für & und | hängt das Ergebnis Art, wie die Operanden die jeweiligen speziellen Methoden überlasten (True & False ist False, 99 & 7 ist 3, für Sätze es Gewerkschaften / Kreuzung ...).

Aber selbst wenn z.B. a_boolean & another_boolean würde identisch arbeiten, die richtige Lösung ist and mit -., nur weil and und or mit Booleschen Ausdruck und Bedingung verbunden werden, während & und | steht für Bit twiddling

Hier ist ein weiterer Unterschied, der ich für einen hatte verwirrt, während gerade jetzt: weil & (und andere Bitoperatoren) eine höhere Priorität als and (und andere Booleschen Operatoren) die folgenden Ausdrücke auf unterschiedliche Werte zu bewerten:

0 < 1 & 0 < 2

Vergleich

0 < 1 and 0 < 2

Nämlich, die ersten Ausbeuten False wie es entspricht 0 < (1 & 0) < 2 ist, daher 0 < 0 < 2 daher 0 < 0 and 0 < 2.

Wenn Sie versuchen, elementweise Boolesche Operationen in numpy zu tun, ist die Antwort ein wenig anders. Sie können & und | für elementweise Boolesche Operationen verwenden, aber and und or wird Wert Fehler zurück.

auf der sicheren Seite zu sein, können Sie die numpy Funktionen Logik .

np.array([True, False, True]) | np.array([True, False, False])
# array([ True, False,  True], dtype=bool)

np.array([True, False, True]) or np.array([True, False, False])
# ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

np.logical_or(np.array([True, False, True]), np.array([True, False, False]))
# array([ True, False,  True], dtype=bool)

Boolesche Operation sind logische Operationen.

Bitweise Operationen sind Operationen auf binäre Bits.

bitweise Operationen:

>>> k = 1
>>> z = 3
>>> k & z  
1
>>> k | z  
3

Die Operationen:

And & 1 if both bits are 1, 0 otherwise
Or  | 1 if either bit is 1
Xor ^ 1 if the bits are different, 0 if they're the same
Not ~ Flip each bit

Einige der Anwendungen von Bit-Operationen:

1) Setzen und Löschen Bits

Boolesche Operationen:

>>> k = True
>>> z = False
>>> k & z  # and
False
>>> k | z  # or
True
>>> 

Der Hinweis ist im Namen:

  • Boolesche Operatoren sind für die Durchführung logische Operationen (Wahrheit in der Programmierung und der formalen Logik zu testen häufig)
  • Bit-Operatoren sind für "Bit-Fummel" (Low-Pegel Manipulation von Bits in Byte und numerischen Datentypen)

Während es möglich ist, und in der Tat manchmal wünschenswert, (in der Regel aus Effizienzgründen) logische Operationen mit Bitoperatoren ausführen, sollten Sie in der Regel vermeiden sie für solche Zwecke geringfügige Fehler und unerwünschte Nebenwirkungen zu vermeiden.

Wenn Sie Bits manipulieren müssen, dann werden die Bit-Operatoren sind Zweck gebaut. Der Spaß Buch: Hackers Delight einige coole und wirklich nützliche Beispiele von dem, was enthält können mit Bit-Fummeln erreicht werden.

Die allgemeine Regel ist den entsprechenden Operator für die vorhandenen Operanden zu verwenden. Verwenden boolean (logische) Operatoren mit boolean Operanden und Bit-Operatoren mit (größeren) integral Operanden (Anmerkung: False entspricht 0 und True 1 ). Das einzige „tricky“ Szenario bewirbt Booleschen Operatoren auf nicht boolean Operanden.
Nehmen wir ein einfaches Beispiel, wie in beschrieben [SO]: Python - Unterschiede zwischen ‚und 'und '&'[Duplikat] :.. 5 & 7 vs 5 and 7

Für die bitweise und ( & ), sind die Dinge ziemlich einfach:

5     = 0b101
7     = 0b111
-----------------
5 & 7 = 0b101 = 5

Für die logische und , hier ist was [Python 3]: Boolesche Operationen Staaten ( Betonung ist von mir):

  

(Beachten Sie, dass weder und noch oder den Wert zu beschränken und geben sie sie auf false und < em> True , sondern kehrt das letzte Argument ausgewertet .

Beispiel: :

>>> 5 and 7
7
>>> 7 and 5
5

Natürlich gilt das gleiche für |.. vs oder

Boolean 'und' vs. Bitwise '&':

Pseudo-Code / Python hat mir geholfen, den Unterschied zwischen diesen verstehen:

def boolAnd(A, B):
    # boolean 'and' returns either A or B
    if A == False:
        return A
    else:
        return B

def bitwiseAnd(A , B):
    # binary representation (e.g. 9 is '1001', 1 is '0001', etc.)

    binA = binary(A)
    binB = binary(B)



    # perform boolean 'and' on each pair of binaries in (A, B)
    # then return the result:
    # equivalent to: return ''.join([x*y for (x,y) in zip(binA, binB)])

    # assuming binA and binB are the same length
    result = []
    for i in range(len(binA)):
      compar = boolAnd(binA[i], binB[i]) 
      result.append(compar)

    # we want to return a string of 1s and 0s, not a list

    return ''.join(result)

Logische Operationen

sind in der Regel für bedingte Anweisungen verwendet. Zum Beispiel:

if a==2 and b >10 then /*Do something...*/ endif Es bedeutet, wenn beide Bedingungen ((a == 2) (b> 10)) zur gleichen Zeit wahr sind dann bedingte Anweisung Körper ausgeführt werden kann.

Bitweise Operationen

Bitweise Operationen können für die Datenmanipulation und Extraktion verwendet werden. Zum Beispiel, wenn Sie vier extrahieren mögen LSB (Least Significant Bits) eine ganze Zahl, können Sie dies tun:

Extraction:

poo & 0x000F

Maskierung:

poo | 0xFFF0

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top