2010-03-16 10 views
71

natknąłem operatora karetki w Pythonie dziś i próbuje ją, mam następujący wynik:Co robi operator karetki (^) w Pythonie?

>>> 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 
>>> 

wydaje się być oparty na 8, więc zgaduję jakieś działania bajtów? Nie mogę znaleźć zbyt wiele informacji na temat tych stron przeszukiwania, poza tym, że zachowują się dziwnie dla elementów pływających, czy ktoś ma link do tego, co robi ten operator, czy może możesz to wyjaśnić tutaj?

+3

Dla liczb całkowitych, to samo robi w C^_- –

+8

FYI, z powłoki Pythona, można wpisać 'help („^”)' – seth

+1

-1: To jest całkowicie pokryte w dokumentacji Pythona i dołączoną funkcję pomocy. Zadawanie tego pytania tutaj jest głupie. –

Odpowiedz

109

Jest to bitowe XOR (exclusive OR).

Wynikiem tego jest true, jeśli jeden (i tylko jeden) z operandów (sprawdza się) true.

wykazać:

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

Aby wyjaśnić jeden z własnych przykładów:

>>> 8^3 
11 

Pomyśl o tym w ten sposób:

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

Nieco bardziej ilustrujący przykład może zawierać zarówno liczby mające "1" w tekście. tak samo, aby wyjaśnić, że '1 xor 1 = 0'. –

+1

Chciałem dodać, możesz tworzyć liczby binarne, wpisując '0bX', gdzie X to twój plik binarny. '0b0001',' 0b0010', itd. Zatem '0b1101^0b1110' dałoby ci' 0b0011' (lub 3). – Jeff

+0

Myślę, że "wynik jest prawdziwy, jeśli jeden (i tylko jeden) z operandy (ocenia) jest prawdziwy." nie jest dokładna, to jaka byłaby definicja wartości boolowskiej xor –

37

wywołuje metodę __xor__() lub __rxor__() obiekt w razie potrzeby, który dla typów całkowitych ma bitowy wyłączny-lub.

+3

+1 dla wskazania, co to naprawdę * robi, poza operacją całkowitą. –

7

Ogólnie mówiąc, symbol ^ jest wersją metody ^. Wszystkie typy danych umieszczone po prawej i lewej stronie symbolu muszą implementować tę funkcję w kompatybilny sposób. Dla liczb całkowitych, to wspólna XOR operacja, ale na przykład nie ma wbudowaną definicja funkcji dla typu float z rodzaju 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' 

Jeden schludny rzeczą w Pythonie jest to, że można to zmienić w klasie własnej. Na przykład w niektórych językach symbol ^ oznacza potęgowanie. Można to zrobić ten sposób, po prostu jako jeden przykład:

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

Potem coś jak to będzie działać, a teraz do wystąpień Foo tylko The ^ symbol oznacza potęgowanie.

In [16]: x = Foo(3) 

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

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

Woah, czy to było możliwe? i czy możemy prawdopodobnie zmienić sposób działania operatora '+'? –

+0

Tak, w ten sposób symbol '+' jest w stanie wykonać jeden rodzaj akcji dla 'list' (konkatenacji) podczas wykonywania innego rodzaju akcji (dodanie matematyczne) dla typów liczbowych. W takim przypadku można zastąpić metody "__add__" lub "__radd__" w swojej klasie. – ely

+1

Na marginesie, wersja '__r * __' z tych (jak '__rxor__' lub' __radd__') zostanie wywołana z argumentu pojawiającego się po prawej stronie * symbolu infiksowania i tylko wtedy, gdy wywołanie funkcja symbolu lewej ręki nie działa. Możesz myśleć o tym jak 'try: left_hand_symbol .__ xor __ (right_hand_symbol); oprócz: right_hand_symbol .__ rxor __ (left_hand_symbol) ', ale' xor' może być zastąpiony przez dowolny z dostępnych operatorów infiksów w [Python Data Model] (http://docs.python.org/3.1/reference/datamodel.html? highlight = rlshift). – ely