Почему этот оператор Python 3 использует побитовое или вместо или?

Этот код Python ниже я нашел как часть постановка задачи здесь:

Разделение двух целых чисел без использования операций умножения, деления и модуляции. Даны два целых числа, скажем, a и b. Найдите частное после деления a на b без использования умножения, деления и оператора mod.

sign = (-1 if((dividend < 0) ^  
                  (divisor < 0)) else 1); 

Я заметил, что код не работает, если у вас нет побитового или оператора. Зачем вам нужно «побитовое или» вместо логического «или»?


person Nona    schedule 19.02.2019    source источник
comment
^ является оператором XOR, а не оператором OR.   -  person Jonah Bishop    schedule 19.02.2019
comment
закрывая вопрос, пока у него есть один хороший ответ, а не миллион других...   -  person Jean-François Fabre    schedule 19.02.2019


Ответы (3)


^ — это исключающее ИЛИ, но в Python нет логического исключающего ИЛИ. Этот код использует тот факт, что True == 1 и False == 0 так что использование побитового исключающего или имеет тот же эффект. (Например, True ^ False == 1 ^ 0 == 1 == True.)

Используя обычное короткое замыкание and и or, тогда тест (с лишними скобками) будет выглядеть так:

sign = -1 if (dividend < 0 and divisor > 0) or (dividend > 0 and divisor < 0) else 1
person chepner    schedule 19.02.2019
comment
логическое исключение или бесполезно в любом случае, поскольку вам нужно оценить обе части, и это не приведет к короткому замыканию. - person Jean-François Fabre; 19.02.2019
comment
Я не сказал «исключительно» — иначе произойдет короткое замыкание; Я просто назвал and и or коротким замыканием (а не логическими, поскольку, строго говоря, они не являются логическими операторами). - person chepner; 19.02.2019
comment
нет проблем с вашим ответом. Я просто заметил, что бесполезно иметь xor, так как это будет то же самое, что и ^. Ну, в С++ 11 есть and и &&, как говорится... - person Jean-François Fabre; 19.02.2019

Это побитовый оператор XOR. Подробнее об XOR см. здесь.

person Andrew Jones    schedule 19.02.2019

Это работает, потому что это не побитовый оператор ИЛИ, а скорее побитовый оператор XOR. Ознакомьтесь с документацией Python по побитовым операторам.

Из Википедии:

Исключающая или или исключающая дизъюнкция — это логическая операция, которая выводит истину только тогда, когда входные данные различаются (одно верно, другое ложно).

person felipecgonc    schedule 19.02.2019