ทำไม ~ ผลลัพธ์ที่แท้จริงใน -2?


133

ในคอนโซล Python:

~True

ให้ฉัน:

-2

ทำไม? ใครช่วยอธิบายกรณีนี้ให้ฉันฟังเป็นไบนารีได้ไหม


23
เพราะ~1เป็น-2ลอง:True == 1
Grijesh Chauhan

15
เพียงเพื่อจะแม่นยำ: มันไม่ได้เป็นความจริงที่ว่า " True is 1" True == 1แต่ก็เป็นความจริงว่า
Bach

3
คุณคิดว่าการได้เห็นUNARY_INVERT(รหัสไบต์ทั้งหมด) จะเพิ่มอะไรให้กับคำตอบหรือไม่?
Wooble

2
คำถามนี้ไม่ซ้ำ! boolมันจะถามเกี่ยวกับพฤติกรรมเฉพาะของ ไม่เกี่ยวกับวิธีการ~ทำงาน ในความเป็นจริงคำตอบที่ถูกต้องสำหรับคำถามนี้สามารถหลีกเลี่ยงการกล่าวถึงส่วนเติมเต็มของ 2 และวิธี~ดำเนินการกับจำนวนเต็มได้เลย
Bakuriu

คำตอบ:


241

int(True)คือ1.

1 คือ:

00000001

และ~1เป็น:

11111110

ซึ่งอยู่-2ในส่วนประกอบของ Two 1

1พลิกบิตทั้งหมดเพิ่ม 1 ในจำนวนผลลัพธ์และตีความผลลัพธ์เป็นการแสดงค่าไบนารีของขนาดและเพิ่มเครื่องหมายลบ (เนื่องจากตัวเลขขึ้นต้นด้วย 1):

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

1
@ofcapl แค่อยากจะบอกว่า: แม้ว่าจะint('1')เป็นเช่นกัน1แต่~'1'เป็นข้อยกเว้นประเภทข้อผิดพลาดในขณะที่~Trueไม่ใช่เพราะboolเป็นคลาสย่อยของint@ Martijn ได้เพิ่มข้อมูลนี้ในคำตอบของเขา
Grijesh Chauhan

สำหรับเร็กคอร์ด @ofcapl คำตอบนี้แสดงการตีความเลขคณิตไบนารีของสิ่งที่เกิดขึ้นไม่ใช่ไบต์โค้ดจริง(ซึ่งจะเป็นโค้ดระดับกลางหรือระดับการทำงานที่รวบรวมจากแหล่งที่มา)
Patrick M

5
@etrusco คุณกำลังพูดถึงภาษาอะไร? ฉันรู้ว่าที่ 0 True == -1และฉันรู้ว่าหลายคนที่หนึ่งอาจกล่าวได้ว่าTrue == 1...
l4mpi

1
@etrusco @ l4mpi พื้นฐานของโรงเรียนเก่าบางแห่งใช้-1สำหรับ TRUE; มีคุณสมบัติที่ดีที่ตัวดำเนินการบิต AND และ OR ทำงานสำหรับตรรกะ AND และ OR เช่นกัน ( x & -1ไม่ใช่ศูนย์ในกรณีเดียวกับที่x && 1ไม่ใช่ศูนย์ใน C) ตราบใดที่คุณไม่สนใจเกี่ยวกับการลัดวงจร . อย่างไรก็ตามเท่าที่ฉันทราบไม่มีภาษาหลักใดที่เคยใช้-1กับ TRUE
Quuxplusone

1
ตรรกะที่truthเป็นทางการกำหนดว่าไม่มีค่า; กับสิ่งที่ไม่ได้เป็นtrue falseทุกภาษาการเขียนโปรแกรมที่ฉันรู้เทิตรรกะที่เป็นทางการบนหัวของมันกำหนดfalseเป็น univalued (0) และสิ่งที่ไม่เป็นเท็จtrue) ยกตัวอย่างเช่นC #แม้ว่า Javascript เป็นอะไรบางอย่างที่ผิดปกติมีหลายรสชาติของ truthiness และหลายรสชาติของ falsiness
Nicholas Carey

45

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บิตเริ่มต้นหมายถึงค่าเป็นลบและบิตที่เหลือจะเข้ารหัสค่าผกผันของจำนวนบวกลบหนึ่ง


1
@GrijeshChauhan: สำหรับคำชมของสองคนคุณสามารถใช้struct.packเป็นbin(integer)หรือformat(integer, '08b')ไม่คำนึงถึงจำนวนเต็มที่ลงนาม
Martijn Pieters

@thefourtheye, MartijnPieters ฉันพยายาม แต่มันเป็นความสับสนเช่นbin(~True), bin(-2), bin(~1)ทั้งหมดให้'-0b10' หาก-2ตัวแทนคือ10แล้วทำไม-เข้าสู่ระบบ
Grijesh Chauhan

ฉันหมายถึงอะไร102'complement แล้ว -ve?
Grijesh Chauhan

1
@GrijeshChauhan คุณสามารถรับสัญกรณ์เสริมของทั้งสองได้ทั้งจำนวนลบและจำนวนบวกเช่นนี้format(-2 % (1 << 32), "032b")
thefourtheye

2
@thefourtheye: ฉันจะใช้ bitmask:format(-2 & ((1 << 32) - 1), "032b")
Martijn Pieters

4

~True == -2จะไม่น่าแปลกใจถ้า Trueหมาย1 และ ~หมายถึงค่าที่เหมาะสมผกผัน ...

... โดยมีเงื่อนไขว่า


การแก้ไข:

  • แก้ไขการผสมระหว่างการแสดงจำนวนเต็มและตัวดำเนินการผกผันแบบบิต
  • ใช้การขัดอีกครั้ง (ข้อความยิ่งสั้นยิ่งจำเป็นต้องใช้งานมากขึ้น)

2
~ไม่ได้หมายถึง "2s complement" ~หมายถึง "Bitwise Inversion"
McKay

1
วลี "ส่วนเติมเต็มของคน" ไม่ได้หมายถึงการดำเนินการมากนักเนื่องจากหมายถึงระบบการจัดเก็บจำนวนเต็มเป็นบิต ระบบที่ไม่ได้ใช้จริงในระบบคอมพิวเตอร์
McKay
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.