ในคอนโซล Python:
~True
ให้ฉัน:
-2
ทำไม? ใครช่วยอธิบายกรณีนี้ให้ฉันฟังเป็นไบนารีได้ไหม
ในคอนโซล Python:
~True
ให้ฉัน:
-2
ทำไม? ใครช่วยอธิบายกรณีนี้ให้ฉันฟังเป็นไบนารีได้ไหม
True is 1
" True == 1
แต่ก็เป็นความจริงว่า
UNARY_INVERT
(รหัสไบต์ทั้งหมด) จะเพิ่มอะไรให้กับคำตอบหรือไม่?
bool
มันจะถามเกี่ยวกับพฤติกรรมเฉพาะของ ไม่เกี่ยวกับวิธีการ~
ทำงาน ในความเป็นจริงคำตอบที่ถูกต้องสำหรับคำถามนี้สามารถหลีกเลี่ยงการกล่าวถึงส่วนเติมเต็มของ 2 และวิธี~
ดำเนินการกับจำนวนเต็มได้เลย
คำตอบ:
int(True)
คือ1
.
1
คือ:
00000001
และ~1
เป็น:
11111110
ซึ่งอยู่-2
ในส่วนประกอบของ Two 1
1พลิกบิตทั้งหมดเพิ่ม 1 ในจำนวนผลลัพธ์และตีความผลลัพธ์เป็นการแสดงค่าไบนารีของขนาดและเพิ่มเครื่องหมายลบ (เนื่องจากตัวเลขขึ้นต้นด้วย 1):
11111110 → 00000001 → 00000010
↑ ↑
Flip Add 1
ซึ่งเป็น 2 แต่เครื่องหมายเป็นลบเนื่องจากMSBคือ 1
มูลค่าการกล่าวขวัญ:
ลองคิดดูbool
คุณจะพบว่ามันเป็นตัวเลข - มีสองค่าTrue
และFalse
และเป็นเพียงเวอร์ชัน "กำหนดเอง" ของจำนวนเต็ม 1 และ 0 ซึ่งพิมพ์ต่างกันเท่านั้น พวกเขาจะsubclassesint
ชนิดจำนวนเต็ม
ดังนั้นพวกมันจึงทำงานเป็น 1 และ 0 ทุกประการยกเว้นว่าจะbool
กำหนดนิยามใหม่str
และrepr
แสดงให้แตกต่างกัน
>>> type(True)
<class 'bool'>
>>> isinstance(True, int)
True
>>> True == 1
True
>>> True is 1 # they're still different objects
False
int('1')
เป็นเช่นกัน1
แต่~'1'
เป็นข้อยกเว้นประเภทข้อผิดพลาดในขณะที่~True
ไม่ใช่เพราะbool
เป็นคลาสย่อยของint
@ Martijn ได้เพิ่มข้อมูลนี้ในคำตอบของเขา
True == -1
และฉันรู้ว่าหลายคนที่หนึ่งอาจกล่าวได้ว่าTrue == 1
...
-1
สำหรับ TRUE; มีคุณสมบัติที่ดีที่ตัวดำเนินการบิต AND และ OR ทำงานสำหรับตรรกะ AND และ OR เช่นกัน ( x & -1
ไม่ใช่ศูนย์ในกรณีเดียวกับที่x && 1
ไม่ใช่ศูนย์ใน C) ตราบใดที่คุณไม่สนใจเกี่ยวกับการลัดวงจร . อย่างไรก็ตามเท่าที่ฉันทราบไม่มีภาษาหลักใดที่เคยใช้-1
กับ TRUE
truth
เป็นทางการกำหนดว่าไม่มีค่า; กับสิ่งที่ไม่ได้เป็นtrue
false
ทุกภาษาการเขียนโปรแกรมที่ฉันรู้เทิตรรกะที่เป็นทางการบนหัวของมันกำหนดfalse
เป็น univalued (0) และสิ่งที่ไม่เป็นเท็จtrue
) ยกตัวอย่างเช่นC #แม้ว่า Javascript เป็นอะไรบางอย่างที่ผิดปกติมีหลายรสชาติของ truthiness และหลายรสชาติของ falsiness
bool
ประเภทPython เป็นคลาสย่อยของint
(ด้วยเหตุผลทางประวัติศาสตร์บูลีนถูกเพิ่มใน Python 2.3 เท่านั้น)
ตั้งแต่int(True)
เป็น1
, ~True
เป็นคือ~1
-2
ดูPEP 285สำหรับสาเหตุbool
ที่ subclass ของint
.
หากคุณต้องการผกผันบูลีนให้ใช้not
:
>>> not True
False
>>> not False
True
หากคุณต้องการทราบสาเหตุ~1
นั่น-2
เป็นเพราะคุณกำลังกลับบิตทั้งหมดในจำนวนเต็มที่มีลายเซ็น 00000001
กลายเป็น1111110
ซึ่งในจำนวนเต็มเซ็นชื่อเป็นจำนวนลบดูส่วนประกอบของ Two :
>>> # Python 3
...
>>> import struct
>>> format(struct.pack('b', 1)[0], '08b')
'00000001'
>>> format(struct.pack('b', ~1)[0], '08b')
'11111110'
โดยที่1
บิตเริ่มต้นหมายถึงค่าเป็นลบและบิตที่เหลือจะเข้ารหัสค่าผกผันของจำนวนบวกลบหนึ่ง
struct.pack
เป็นbin(integer)
หรือformat(integer, '08b')
ไม่คำนึงถึงจำนวนเต็มที่ลงนาม
bin(~True)
, bin(-2)
, bin(~1)
ทั้งหมดให้'-0b10'
หาก-2
ตัวแทนคือ10
แล้วทำไม-
เข้าสู่ระบบ
10
2'complement แล้ว -ve?
format(-2 % (1 << 32), "032b")
format(-2 & ((1 << 32) - 1), "032b")
~True == -2
จะไม่น่าแปลกใจถ้า True
หมาย1
และ ~
หมายถึงค่าที่เหมาะสมผกผัน ...
... โดยมีเงื่อนไขว่า
True
สามารถถือเป็นจำนวนเต็มและการแก้ไข:
~
ไม่ได้หมายถึง "2s complement" ~
หมายถึง "Bitwise Inversion"
~1
เป็น-2
ลอง:True == 1