Operatory logiczne a operatory bitowe

Jestem zdezorientowany, kiedy powinienem używać operatorów logicznych vs bitowych

  • and vs &
  • or vs |

Czy ktoś mógłby mnie oświecić, kiedy używam każdego i kiedy używanie jednego nad drugim wpłynie na moje wyniki?

Author: wjandrea, 2010-10-02

9 answers

Oto kilka wskazówek:

  • operatory logiczne są zwykle używane na wartościach boolean , ale operatory bitowe są zwykle używane na wartościach integer .
  • operatory logiczne są zwarciem , ale operatory bitowe są, a nie zwarciem.

Zachowanie zwarcia jest przydatne w wyrażeniach takich jak:

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

Nie działałoby to poprawnie z operatorem bitowym &, ponieważ obie strony zawsze będzie oceniana, dając AttributeError: 'NoneType' object has no attribute 'foo'. Gdy używasz operatora boolean and, drugie wyrażenie nie jest obliczane, gdy pierwsze jest False. Podobnie or nie ocenia drugiego argumentu, jeśli pierwszy jest prawdziwy.

 78
Author: Mark Byers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-03 07:48:46

W teorii, and i or pochodzą prosto z logiki logicznej (i dlatego działają na dwóch logikach logicznych, tworząc logikę logiczną), podczas gdy & i | stosują logikę logiczną i/lub do poszczególnych bitów liczb całkowitych. Jest tu wiele pytań na temat tego, jak dokładnie działają te ostatnie.

Oto praktyczne różnice, które potencjalnie wpływają na wyniki:

  1. and i or zwarcie, np. True or sys.exit(1) nie zakończy się, ponieważ dla pewnej wartości pierwszego operanda (True or ..., False and ...), drugi nie zmieniłby wyniku, więc nie musi być oceniany. Ale | i & nie zwarć - True | sys.exit(1) wyrzuca cię z REPL.
  2. & i | są operatorami regularnymi i mogą być przeciążone, podczas gdy and i or są tworzone w języku (chociaż specjalna metoda przymusu do boolean może mieć skutki uboczne).
    • dotyczy to również niektórych innych języków z przeciążeniem operatorów
  3. and i or Zwraca wartość operandu zamiast True lub False. Nie zmienia to znaczenia wyrażeń logicznych w Warunkach - 1 or True jest 1, ale 1 jest również prawdą. Ale kiedyś był używany do emulowania operatora warunkowego ({[23] } w składni C, true_val if cond else false_val w Pythonie). Dla & i |, Typ wyniku zależy od tego, jak operandy przeciążają odpowiednie metody specjalne (True & False jest False, 99 & 7 jest 3, dla zbiorów jest to związek / przecięcie...).
    • dotyczy to również innych języki takie jak Ruby, Perl i Javascript

Ale nawet jeśli np. a_boolean & another_boolean będzie działać identycznie, właściwym rozwiązaniem jest użycie and - po prostu dlatego, że and i or są związane z wyrażeniem logicznym i warunkiem, podczas gdy & i | oznaczają bit twidling.

 24
Author: wjandrea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-05 17:16:33

Oto kolejna różnica, która mnie zastanowiła przez jakiś czas: ponieważ & (i inne operatory bitowe) mają wyższy priorytet niż and (i inne operatory logiczne) następujące wyrażenia oceniają na różne wartości:

0 < 1 & 0 < 2

Kontra

0 < 1 and 0 < 2

W skrócie, pierwszy daje False jako odpowiednik 0 < (1 & 0) < 2, stąd 0 < 0 < 2, stąd 0 < 0 and 0 < 2.

 21
Author: Arend,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-20 14:07:03

Jeśli próbujesz wykonać operacje logiczne w numpy, Odpowiedź jest nieco inna. Możesz użyć & i | do operacji logicznych, ale and i or zwrócą błąd wartości.

Aby być po bezpiecznej stronie, możesz użyć funkcji logicznych numpy.

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)
 4
Author: C8H10N4O2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-03 17:13:36

Podpowiedź jest w nazwie:

  • operatory logiczne służą do wykonywania operacji logicznych (testowanie prawdy powszechne w programowaniu i logice formalnej)
  • Operatory bitowe są dla "bit-twidling" (niskopoziomowa manipulacja bitami w typach danych bajtowych i numerycznych)

O ile możliwe i czasami pożądane (zazwyczaj ze względu na wydajność) jest wykonywanie operacji logicznych z operatorami bitowymi, to generalnie należy ich unikać w takich celem zapobiegania subtelnym błędom i niepożądanym skutkom ubocznym.

Jeśli trzeba manipulować bitami, wtedy operatory bitowe są specjalnie budowane. Zabawna książka: hakerzy zachwycają zawiera kilka fajnych i naprawdę użytecznych przykładów tego, co można osiągnąć dzięki bit-twidling.

 3
Author: Tendayi Mawushe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-02 10:46:43

Ogólną zasadą jest użycie odpowiedniego operatora dla istniejących operandów. Użycie boolean (logiczne) operatory z boolean operandów oraz bitowe operatorzy z (szerzej) integral operands (note: False {[8] } jest równoważne 0, and True to 1). Jedynym "trudnym" scenariuszem jest stosowanie operatorów logicznych do nie-logicznych operandów.
weźmy prosty przykład, opisany w [SO]: Python-różnice między 'and' I '&':
5 & 7 vs. 5 and 7.

Dla bitowego i (&), wszystko jest dość proste:

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

Dla logicznego i, Oto co [Python.Docs]: Boolean operations states ( emfaza jest moja):

(zauważ, że ani i, ani ani nie ograniczają wartości i typu zwraca False i True , ale raczej zwraca ostatni oceniany argument .

Przykład :

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

Oczywiście to samo dotyczy | vs. lub .

 2
Author: CristiFati,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-02 11:33:52

Operacje logiczne są operacjami logicznymi.

Operacje bitowe to operacje na bitach binarnych.

Operacje bitowe:

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

Operacje:

  • i &: 1 jeśli oba bity są 1, w przeciwnym razie 0
  • lub |: 1 jeśli bit jest 1, w przeciwnym razie 0
  • XOR ^: 1 jeśli bity są różne, 0 jeśli są takie same
  • nie ~': Odwróć każdy bit
Niektóre zastosowania operacji bitowych:
  1. Ustawianie i rozliczanie Bity

Operacje logiczne:

>>> k = True
>>> z = False
>>> k & z  # and
False
>>> k | z  # or
True
>>> 
 1
Author: pyfunc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-05 17:09:00

Boolean ' and ' vs. Bitwise '&':

Pseudo-kod / Python pomógł mi zrozumieć różnicę między nimi:

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)
 0
Author: Geoff Langenderfer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-26 23:21:55

Operacje Logiczne

Są zwykle używane do instrukcji warunkowych. Na przykład:

if a==2 and b>10:
    # Do something ...

Oznacza to, że jeśli oba warunki (a==2 i b>10) są prawdziwe w tym samym czasie, to ciało instrukcji warunkowej może być wykonane.

Operacje Bitowe

Są używane do manipulacji i ekstrakcji danych. Na przykład, jeśli chcesz wyodrębnić cztery LSB (najmniej znaczące Bity) liczby całkowitej, możesz to zrobić:

p & 0xF
 0
Author: pooria,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-05 17:46:23