Di konsol Python:
~True
Memberi saya:
-2
Mengapa? Bisakah seseorang menjelaskan kasus khusus ini kepada saya dalam bentuk biner?
python
data-conversion
tilde
lukaszkups
sumber
sumber
~1
adalah-2
, Coba:True == 1
True is 1
" itu tidak benar , tetapi itu benarTrue == 1
.UNARY_INVERT
(seluruh bytecode) akan menambah sesuatu pada jawaban?bool
. Ini bukan tentang cara~
kerjanya. Sebenarnya jawaban yang valid untuk pertanyaan ini dapat menghindari menyebutkan komplemen 2 dan bagaimana~
beroperasi pada bilangan bulat sama sekali.Jawaban:
int(True)
adalah1
.1
adalah:dan
~1
adalah:Yang ada
-2
di komplemen Two's 11 Balik semua bit, tambahkan 1 ke angka yang dihasilkan dan interpretasikan hasilnya sebagai representasi biner dari besarnya dan tambahkan tanda negatif (karena angka dimulai dengan 1):
Yang 2, tetapi tandanya negatif karena MSB adalah 1.
Layak disebut:
Pikirkan
bool
, Anda akan menemukan bahwa itu sifatnya numerik - Ini memiliki dua nilai,True
danFalse
, dan itu hanyalah versi "khusus" dari bilangan bulat 1 dan 0 yang hanya mencetak diri mereka secara berbeda. Mereka adalah subclass dari tipe integerint
.Jadi mereka berperilaku tepat seperti 1 dan 0, kecuali itu
bool
mendefinisikan ulangstr
danrepr
menampilkannya secara berbeda.sumber
int('1')
juga1
tetapi~'1'
menjadi typeerror exception sedangkan~True
bukankah ini karenabool
subclass dariint
@ Martijn menambahkan informasi ini dalam jawabannya.True == -1
, dan saya tahu banyak di mana orang dapat mengatakan bahwaTrue == 1
...-1
untuk BENAR; ia memiliki properti bagus yang bitwise AND dan OR operator bekerja untuk logika AND dan OR juga (x & -1
tidak nol dalam kasus yang sama yangx && 1
tidak nol dalam C), selama Anda tidak peduli tentang hubungan arus pendek . Namun, sejauh yang saya tahu, tidak ada bahasa utama yang pernah digunakan-1
untuk TRUE.truth
sebagai tidak bernilai; dengan semua yang tidaktrue
adafalse
. Semua bahasa pemrograman yang saya sadari mengubah logika formal di atas kepalanya, mendefinisikanfalse
sebagai tidak bernilai (0) dan semua yang tidak salah adalahtrue
). Misalnya C # , meskipun Javascript adalah sesuatu yang outlier, memiliki beberapa rasa kebenaran dan banyak rasa kepalsuan .bool
Tipe Python adalah subkelas dariint
(karena alasan historis; boolean hanya ditambahkan dalam Python 2.3).Sejak
int(True)
adalah1
,~True
adalah~1
adalah-2
.Lihat PEP 285 untuk alasan mengapa
bool
subclass dariint
.Jika Anda menginginkan boolean invers, gunakan
not
:Jika Anda ingin tahu mengapa
~1
adalah-2
, itu karena Anda pembalik semua bit dalam bilangan bulat ditandatangani;00000001
menjadi1111110
yang dalam bilangan bulat yang ditandatangani adalah angka negatif, lihat komplemen Dua :di mana
1
bit awal berarti nilainya negatif, dan sisa bit mengkodekan kebalikan dari angka positif dikurangi satu.sumber
struct.pack
, sebagaibin(integer)
atauformat(integer, '08b')
tidak memperhitungkan bilangan bulat yang ditandatangani.bin(~True)
,bin(-2)
,bin(~1)
semua memberi'-0b10'
Jika-2
representasi adalah10
mengapa-
tanda.10
sendirinya?format(-2 % (1 << 32), "032b")
format(-2 & ((1 << 32) - 1), "032b")
~True == -2
adalah tidak mengejutkan jikaTrue
sarana1
dan~
sarana bitwise inversi ...... asalkan itu
True
dapat diperlakukan sebagai bilangan bulat danSuntingan:
sumber
~
tidak berarti "komplemen 2s".~
berarti "Pembalikan Bitwise"