Логические операторы против побитовых операторов
-
27-09-2019 - |
Вопрос
Я в замешательстве относительно того, когда я должен использовать логические или побитовые операторы
and
против&
or
против|
Может ли кто-нибудь просветить меня относительно того, когда я использую каждый из них и когда использование одного поверх другого повлияет на мои результаты?
Решение
Вот пара руководящих принципов:
- Логические операторы обычно используются на логический ценности, но побитовые операторы обычно используются на целое число значения.
- Логические операторы короткое замыкание Но побитовые операторы нет короткое замыкание.
Поведение короткого замыкания полезно в таких выражениях:
if x is not None and x.foo == 42:
# ...
Это не будет работать правильно с побитовой &
оператор, потому что обе стороны всегда будут оценены, давая AttributeError: 'NoneType' object has no attribute 'foo'
. Отказ Когда вы используете логический and
Оператор Второе выражение не оценивается при первом ложном. по аналогии or
не оценивает второй аргумент, если первое верно.
Другие советы
Теоретически, and
а также or
приходите прямо из логической логики (и, следовательно, работайте на двух логиках, чтобы произвести логическое значение), в то время как &
а также |
Примените логию и / или к индивидуальным битам целых чисел. Здесь много вопросов, насколько точно работает последняя.
Вот практические различия, которые потенциально влияют на ваши результаты:
and
а такжеor
короткое замыкание, то естьTrue or sys.exit(1)
не выйду, потому что для определенного значения (True or ...
,False and ...
) первого операнда, второй не изменит результат = не нужно оценивать. Но|
а также&
Не короткое замыкание -True | sys.exit(1)
бросает вы выйти за всплываю.- (Только относится к некоторым? Языки с перегрузкой оператора, включая Python :)
&
а также|
являются регулярными операторами и могут быть перегружены -and
а такжеor
выковываются на языке (хотя, по крайней мере, в Python, особый метод принуждения к логическому регису может иметь побочные эффекты). - (относится только к нескольким языкам [см. комментарий Кеннитма] :)
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