Pertanyaan Apa yang dilakukan oleh operator caret (^) dengan Python?


Saya berlari di operator caret di python hari ini dan mencobanya, saya mendapat output sebagai berikut:

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

Tampaknya didasarkan pada 8, jadi saya menebak semacam operasi byte? Saya tidak dapat menemukan banyak tentang situs pencarian ini selain berperilaku aneh untuk mengapung, apakah ada yang memiliki tautan dengan apa yang dilakukan operator ini atau dapatkah Anda menjelaskannya di sini?


76
2018-03-16 00:21


asal


Jawaban:


Ini sedikit demi sedikit XOR (ATAU eksklusif).

Hasilnya benar jika satu (dan hanya satu) dari operan (mengevaluasi ke) benar.

Untuk menunjukkan:

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

Untuk menjelaskan salah satu contoh Anda sendiri:

>>> 8^3
11

Pikirkan tentang hal ini dengan cara ini:

1000 # 8 (biner)
0011 # 3 (biner)
---- # APPLY XOR ('vertikal')
1011 # hasil = 11 (biner)

116
2018-03-16 00:23



Ini memanggil __xor__() atau __rxor__() metode objek yang diperlukan, yang untuk tipe integer melakukan bitwise eksklusif atau.


37
2018-03-16 00:37



Ini sedikit demi sedikit eksklusif atau. Operator bitwise biner didokumentasikan dalam bab 5 Referensi Bahasa Python.


12
2018-03-16 00:23



Secara umum, simbolnya ^ adalah infiks versi dari __xor__ atau __rxor__ metode. Apapun tipe data yang ditempatkan ke kanan dan kiri simbol harus mengimplementasikan fungsi ini dengan cara yang kompatibel. Untuk bilangan bulat, itu adalah umum XOR operasi, tetapi misalnya tidak ada definisi fungsi yang terintegrasi untuk tipe float dengan tipe 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'

Satu hal yang bagus tentang Python adalah Anda dapat mengesampingkan perilaku ini di kelas Anda sendiri. Misalnya, dalam beberapa bahasa, ^ simbol berarti eksponensial. Anda bisa melakukannya dengan cara ini, hanya sebagai satu contoh:

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

Maka hal seperti ini akan berhasil, dan sekarang, untuk contoh Foo hanya, yang ^ simbol berarti eksponensial.

In [16]: x = Foo(3)

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

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

7
2017-10-18 13:37