2010-03-16 30 views
71

me encontré con el operador de intercalación en Python hoy y probarlo, me dieron el siguiente resultado:¿Qué hace el operador de intercalación (^) en 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 
>>> 

Parece estar basado en 8, así que supongo que algún tipo de operación de bytes? Parece que no puedo encontrar mucho sobre estos sitios de búsqueda, aparte de que se comporta de forma extraña para las carrozas, ¿alguien tiene un vínculo con lo que hace este operador o puede explicarlo aquí?

+3

Para enteros, lo mismo que lo hace en C.^_- –

+8

FYI, de la cáscara pitón, puede escribir 'ayuda ('^')' – seth

+1

-1: Este está completamente cubierta en la documentación de Python y la función de ayuda incluida. Hacer esta pregunta aquí es tonto. –

Respuesta

109

Es un bit a bit XOR (OR exclusivo).

Resulta verdadero si uno (y solo uno) de los operandos (se evalúa como verdadero).

Para demostrar:

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

Para explicar uno de sus propios ejemplos:

>>> 8^3 
11 

pensar de esta manera:

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

Un ejemplo ligeramente más ilustrativo podría incluir ambos números con '1' en el el mismo bit para dejar en claro que '1 xor 1 = 0'. –

+1

Quería agregar, puedes hacer números binarios escribiendo '0bX' donde X es tu binario. '0b0001',' 0b0010', etc. Por lo tanto, '0b1101^0b1110' le daría' 0b0011' (o 3). – Jeff

+0

Creo que "resulta verdadero si uno (y solo uno) de los operandos (se evalúa como verdadero)". no es exacto, sería la definición de boolean xor –

37

Se invoca el método de __xor__() o __rxor__() el objeto según sea necesario, que para los tipos de enteros hace un bitwise exclusivo-o.

+3

+1 para señalar lo que * really * hace, fuera de la operación entera. –

7

En general, el símbolo ^ es una versión infix de los métodos __xor__ o __rxor__. Los tipos de datos que se colocan a la derecha e izquierda del símbolo deben implementar esta función de forma compatible. Para enteros, es la operación común XOR, pero por ejemplo no hay una definición integrada de la función para el tipo float con el tipo 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' 

Una cosa aseada sobre Python es que se puede anular este comportamiento en una clase propia. Por ejemplo, en algunos idiomas, el símbolo ^ significa exponenciación. Usted podría hacer que de esta manera, al igual que un ejemplo:

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

Entonces algo como esto va a funcionar, y ahora, para las instancias de Foo única, el símbolo ^ significará exponenciación.

In [16]: x = Foo(3) 

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

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

woah, ¿eso fue posible? y ¿podríamos cambiar también cómo funciona el operador '+' también? –

+0

Sí, así es como el símbolo '+' puede hacer un tipo de acción para 'list' (concatenación) mientras realiza otro tipo de acción (adición matemática) para tipos numéricos. En ese caso, anularías los métodos '__add__' o' __radd__' en tu clase. – ely

+1

Como nota al margen, la versión '__r * __' de estos (como '__rxor__' o' __radd__') se invocará desde el argumento que aparece en el * lado derecho * del símbolo infijo, y solo si la llamada a la función para el símbolo de la mano izquierda no funciona. Puedes pensarlo como 'try: left_hand_symbol .__ xor __ (right_hand_symbol); excepto: right_hand_symbol .__ rxor __ (left_hand_symbol) ', pero' xor' puede ser reemplazado por cualquiera de los operadores infix disponibles en el [Python Data Model] (http://docs.python.org/3.1/reference/datamodel.html? highlight = rlshift). – ely