Подтвердить что ты не робот

Что делает оператор каретки (^) в Python?

Я столкнулся с оператором каретки в python сегодня и попробовал его, я получил следующий вывод:

>>> 8^3
11
>>> 8^4
12
>>> 8^1
9
>>> 8^0
8
>>> 7^1
6
>>> 7^2
5
>>> 7^7
0
>>> 7^8
15
>>> 9^1
8
>>> 16^1
17
>>> 15^1
14
>>>

Кажется, что он основан на 8, так что я предполагаю какую-то операцию байта? Я не могу найти многого о таких поисковых сайтах, кроме того, что он ведет себя странно для float, есть ли у кого-нибудь ссылка на то, что этот оператор делает или вы можете объяснить здесь?

4b9b3361

Ответ 1

Это поразрядное XOR (эксклюзивное ИЛИ).

Это приводит к истинному, если один (и только один) из операндов (оценивается) true.

Чтобы продемонстрировать:

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1

Чтобы объяснить один из ваших собственных примеров:

>>> 8^3
11

Подумайте об этом так:

1000  # 8 (binary)
0011  # 3 (binary)
----  # APPLY XOR ('vertically')
1011  # result = 11 (binary)

Ответ 2

Он вызывает метод __xor__() или __rxor__() объекта по мере необходимости, который для целых типов выполняет побитовое исключение - или.

Ответ 4

Вообще говоря, символ ^ является infix версией методов __xor__ или __rxor__. Независимо от того, какие типы данных помещены вправо и влево от символа, необходимо реализовать эту функцию совместимым образом. Для целых чисел это обычная операция XOR, но, например, нет встроенного определения функции для типа float с типом int:

In [12]: 3 ^ 4
Out[12]: 7

In [13]: 3.3 ^ 4
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-13-858cc886783d> in <module>()
----> 1 3.3 ^ 4

TypeError: unsupported operand type(s) for ^: 'float' and 'int'

Один из опций Python - это то, что вы можете переопределить это поведение в своем собственном классе. Например, на некоторых языках символ ^ означает возведение в степень. Вы можете сделать это так, как один пример:

class Foo(float):
    def __xor__(self, other):
        return self ** other

Тогда что-то вроде этого будет работать, и теперь, только для экземпляров Foo, символ ^ будет означать возведение в степень.

In [16]: x = Foo(3)

In [17]: x
Out[17]: 3.0

In [18]: x ^ 4
Out[18]: 81.0