ในคอนโซล 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แล้วทำไม-เข้าสู่ระบบ
102'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