Логические операторы против побитовых операторов

StackOverflow https://stackoverflow.com/questions/3845018

Вопрос

Я в замешательстве относительно того, когда я должен использовать логические или побитовые операторы

  • and против &
  • or против |

Может ли кто-нибудь просветить меня относительно того, когда я использую каждый из них и когда использование одного поверх другого повлияет на мои результаты?

Это было полезно?

Решение

Вот пара руководящих принципов:

  • Логические операторы обычно используются на логический ценности, но побитовые операторы обычно используются на целое число значения.
  • Логические операторы короткое замыкание Но побитовые операторы нет короткое замыкание.

Поведение короткого замыкания полезно в таких выражениях:

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

Это не будет работать правильно с побитовой & оператор, потому что обе стороны всегда будут оценены, давая AttributeError: 'NoneType' object has no attribute 'foo'. Отказ Когда вы используете логический andОператор Второе выражение не оценивается при первом ложном. по аналогии or не оценивает второй аргумент, если первое верно.

Другие советы

Теоретически, and а также or приходите прямо из логической логики (и, следовательно, работайте на двух логиках, чтобы произвести логическое значение), в то время как & а также | Примените логию и / или к индивидуальным битам целых чисел. Здесь много вопросов, насколько точно работает последняя.

Вот практические различия, которые потенциально влияют на ваши результаты:

  1. and а также or короткое замыкание, то есть True or sys.exit(1) не выйду, потому что для определенного значения (True or ..., False and ...) первого операнда, второй не изменит результат = не нужно оценивать. Но | а также & Не короткое замыкание - True | sys.exit(1) бросает вы выйти за всплываю.
  2. (Только относится к некоторым? Языки с перегрузкой оператора, включая Python :) & а также | являются регулярными операторами и могут быть перегружены - and а также or выковываются на языке (хотя, по крайней мере, в Python, особый метод принуждения к логическому регису может иметь побочные эффекты).
  3. (относится только к нескольким языкам [см. комментарий Кеннитма] :) and а также or вернуться (всегда? никогда не понимаю этого, и мне не нужно) ценность операнда вместо True или False. Отказ Это не изменяет значение логических выражений в условиях - 1 or True является 1, но 1 правда тоже. Но когда-то использовалось для эмуляции условного оператора (cond ? true_val : false_val в синтаксисе C, true_val if cond else false_val в Python с нескольких лет). Для & а также |, тип результата зависит от того, как операнды перегрузят соответствующие специальные методы (True & False является False, 99 & 7 является 3, Для установок его профсоюза / пересечения ...).

Но даже когда, например, a_boolean & another_boolean будет работать тойно, правильное решение использует and - просто потому что and а также or связаны с булевым выражением и условием в то время как & а также | стоять на бит Twiddling.

Вот еще одна разница, которая заставила меня на некоторое время озадачена только сейчас: потому что & (и другие побитовые операторы) имеют более высокий приоритет, чем and (и другие булевы операторы) следующие выражения оценивают для разных ценностей:

0 < 1 & 0 < 2

против

0 < 1 and 0 < 2

К острому, первые урожайности False Как это эквивалентно 0 < (1 & 0) < 2, следовательно 0 < 0 < 2, следовательно 0 < 0 and 0 < 2.

Если вы пытаетесь сделать элемент-мудрый булевой операции в numpy, Ответ несколько отличается. Вы можете использовать & а также | для элементных булевых операций, но and а также or вернет ошибку Value.

Быть в безопасной стороне, вы можете использовать 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)

Логическая работа - это логические операции.

Битовые операции - это операции на двоичных битах.

Битовые операции:

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

Операции:

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

Некоторые из применений побитовых операций:

1) Установка и очистка битов

Логические операции:

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

Подсказка на имя:

  • Логические операторы для выполнения логические операции (Тестирование правды, общие в программировании и формальной логике)
  • Побитовые операторы для "Бит-Twiddling" (Манипуляция низкого уровня битов в байтовых и числовых типах данных)

Хотя возможна и действительно иногда желательно (обычно для причин эффективности) выполнять логические операции с битовыми операторами, вы, как правило, следует избегать их для таких целей для предотвращения тонких ошибок и нежелательных побочных эффектов.

Если вам нужно манипулировать битами, то построенные операторы побитовые. Забавная книга: Хакеры восторг Содержит несколько прохладных и действительно полезных примеров того, что может быть достигнуто с помощью битового Twiddling.

Общее правило состоит в том, чтобы использовать соответствующий оператор для существующих операндов. Используйте логические (логические) операторы с логическими операндами и побитовыми операторами с (более широкими) интегральными операндами (примечание: Ложь эквивалентно 0, а также Истинный к 1). Единственным «хитрым» сценарием применяет логические операторы на не булевых операндов.
Давайте пройдем простой пример, как описано в Так]: Python - различия между 'и' и '&' [дубликат: 5 & 7 против. 5 and 7.

Для покое а также (&), все довольно просты:

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

Для логично а также, вот что Python 3]: логические операции состояния (акцент это мое):

(Обратите внимание, что ни один а также ни или ограничить значение и тип, которые они возвращаются в Ложь а также Истинный, скорее вернуть последний проаналированный аргумент.

Пример:

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

Конечно, то же самое относится к | против. или.

Логическое значение "и" противПобитовый '&':

Псевдокод / Python помогли мне понять разницу между этими:

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)

Логические операции

обычно используются для условных утверждений. Например:

if a==2 and b >10 then /*Do something...*/ endif Это означает, что оба условия ((a == 2) (b> 10)) верны одновременно, то может быть выполнено условное тело оператора.

Побитовые операции

Битовые операции могут быть использованы для манипулирования и извлечениями данных. Например, если вы хотите извлечь четыре LSB (наименее значимых битов) целого числа, вы можете сделать это:

Добыча:

poo & 0x000F

Маскировка:

poo | 0xFFF0

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top