क्यों -2 में सच्चा परिणाम है?


132

पायथन कंसोल में:

~True

मुझे देता है:

-2

क्यों? क्या कोई मुझे द्विआधारी में इस विशेष मामले की व्याख्या कर सकता है?


22
क्योंकि ~1है -2:, की कोशिश करोTrue == 1
Grijesh चौहान

15
बस सटीक होने के लिए: यह सच नहीं है कि " True is 1", लेकिन यह सच है कि True == 1
बाच

3
क्या आप वास्तव में देखकर सोच रहे हैं UNARY_INVERT(संपूर्ण बायोटेक) उत्तर के लिए कुछ भी जोड़ देगा?
Wooble

2
यह सवाल डुप्लिकेट नहीं है! यह एक विशिष्ट व्यवहार के बारे में पूछता है bool। यह कैसे ~काम करता है के बारे में नहीं है । वास्तव में इस सवाल का एक वैध जवाब 2 के पूरक का उल्लेख करने से बच सकता है और ~पूर्णांक पर कैसे संचालित होता है।
बकुरीउ

जवाबों:


240

int(True)है 1

1 है:

00000001

और ~1:

11111110

कौन सा है -2में दो के पूरक 1

1 सभी बिट्स को पलटें, परिणामी संख्या में 1 जोड़ें और परिमाण के द्विआधारी प्रतिनिधित्व के रूप में परिणाम की व्याख्या करें और एक नकारात्मक संकेत जोड़ें (चूंकि संख्या 1 से शुरू होती है):

11111110  00000001  00000010 
                    
       Flip       Add 1

जो 2 है, लेकिन एमएसबी 1 के बाद से संकेत नकारात्मक है।


उल्लेखनीय है:

सोचो के बारे में bool, आपको लगता है कि यह प्रकृति में संख्यात्मक है मिल जाएगा - यह दो मान होते हैं, Trueऔर False, और वे सिर्फ पूर्णांक 1 और 0 है कि केवल खुद को अलग ढंग से प्रिंट के संस्करण "अनुकूलित" कर रहे हैं। वे पूर्णांक प्रकार के उपवर्ग हैं int

इसलिए वे ठीक उसी तरह का व्यवहार करते हैं, जैसा कि उस 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ऐसा नहीं है क्योंकि यह है कि @ Martijn के boolएक उपवर्ग intने इस जानकारी को अपने उत्तर में जोड़ा है।
बृजेश चौहान

रिकॉर्ड के लिए, @ofcapl, यह उत्तर बाइनरी अंकगणितीय व्याख्या दिखाता है कि क्या चल रहा है, न कि वास्तविक बाइटेकोड (जो स्रोत से संकलित मध्यवर्ती या ऑपरेशन स्तर कोड का कुछ प्रकार होगा)।
पैट्रिक एम

5
@etrusco आप किन भाषाओं की बात कर रहे हैं? मुझे ठीक से पता है कि 0 कहां है True == -1, और मुझे पता है कि कई लोग कहां कह सकते हैं True == 1...
l4mpi

1
@etrusco @ l4mpi कुछ पुराने स्कूल के मूल -1सत्य के लिए उपयोग ; यह अच्छी संपत्ति है कि बिटवाइज़ और या ऑपरेटर्स तार्किक और या तो के लिए काम करते हैं ( x & -1साथ ही x && 1गैर-शून्य है जो सी में गैर-शून्य है), जब तक आप शॉर्ट-सर्कुलेटिंग के बारे में परवाह नहीं करते हैं । हालाँकि, जहाँ तक मुझे पता है, किसी भी मुख्यधारा की भाषा ने कभी -1TRUE के लिए उपयोग नहीं किया है।
कुक्सप्लोसोन

1
औपचारिक तर्क परिभाषित के truthरूप में; वह सब नहीं हो trueरहा है false। सभी प्रोग्रामिंग भाषाएं जिन्हें मैं अपने सिर पर औपचारिक तर्क के बारे में जानता हूं, falseउन्हें अविभाजित (0) के रूप में परिभाषित किया गया है और यह सब गलत नहीं है true)। उदाहरण के लिए C # , हालांकि जावास्क्रिप्ट एक बाहरी चीज है, जिसमें सच्चाई के कई स्वाद और झूठ के कई स्वाद हैं
निकोलस कैरी

45

अजगर boolप्रकार intऐतिहासिक कारणों के लिए एक उपवर्ग है ; बूलियन केवल पायथन 2.3 में जोड़े गए थे)।

के बाद से int(True)है 1, ~Trueहै ~1है -2

PEP 285 के लिए boolएक उपवर्ग क्यों है देखें int

यदि आप बूलियन उलटा चाहते थे, तो उपयोग करें not:

>>> not True
False
>>> not False
True

यदि आप यह जानना चाहते हैं कि ~1ऐसा क्यों है -2, क्योंकि आप एक हस्ताक्षरित पूर्णांक में सभी बिट्स को निकाल रहे हैं; 00000001हो जाता है 1111110जो एक में हस्ताक्षर किए पूर्णांक एक नकारात्मक संख्या है, को देखने के दो के पूरक :

>>> # 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')खाते में साइन पूर्णांकों नहीं लेते।
मार्टिन पीटर्स

@thefourtheye, MartijnPieters मैं कोशिश की लेकिन यह भ्रामक जैसे bin(~True), bin(-2), bin(~1)सभी देता है '-0b10' तो -2प्रतिनिधित्व है 10तो क्यों -संकेत।
बृजेश चौहान

क्या मैं 10खुद का मतलब 2'complement तो -ve?
बृजेश चौहान

1
@GrijeshChauhan आप इस तरह के नकारात्मक और सकारात्मक दोनों संख्याओं के पूरक अंकन प्राप्त कर सकते हैंformat(-2 % (1 << 32), "032b")
Thefourtheye

2
: @thefourtheye: मैं एक बिटमास्क का उपयोग करेंगेformat(-2 & ((1 << 32) - 1), "032b")
मार्टिन पीटर्स

4

~True == -2है अगर आश्चर्य की बात नहीं True साधन 1 और ~ साधन बिटवाइज़ उलट ...

... बशर्ते कि

  • True एक पूर्णांक के रूप में माना जा सकता है और
  • पूर्णांक दो के पूरक में दर्शाए गए हैं

संपादन:

  • पूर्णांक प्रतिनिधित्व और बिटवाइज़ इनवर्जन ऑपरेटर के बीच मिश्रण को तय किया
  • एक और पॉलिशिंग लागू की गई (संदेश जितना छोटा होगा, उतना ही अधिक काम करने की आवश्यकता होगी)

2
~"2s पूरक" का मतलब यह नहीं है। ~का अर्थ है "बिटवाइज़ इनवर्जन"
मैक

1
वाक्यांश "ओन्स 'पूरक" वास्तव में एक ऑपरेशन को संदर्भित नहीं करता है, जितना कि यह बिट्स में पूर्णांक को संग्रहीत करने की एक प्रणाली को संदर्भित करता है। एक प्रणाली जो वास्तव में एक कंप्यूटर प्रणाली में उपयोग नहीं की जाती है।
मैके
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.