~ x + ~ y == ~ (x + y) हमेशा झूठा होता है?


153

क्या यह कोड हमेशा असत्य का मूल्यांकन करता है? दोनों चर दो हस्ताक्षरित संपूरक हैं।

~x + ~y == ~(x + y)

मुझे लगता है कि कुछ संख्या होनी चाहिए जो शर्तों को पूरा करती है। मैं बीच के अंक का परीक्षण करने की कोशिश की -5000और 5000लेकिन कभी हासिल की समानता। क्या हालत का समाधान खोजने के लिए एक समीकरण स्थापित करने का कोई तरीका है?

क्या मेरे कार्यक्रम में एक कपटपूर्ण बग के कारण दूसरे की अदला-बदली होगी?


6
क्या आप एक साबित करना चाहते हैं या कुछ और?
एल्विन वोंग

26
ज्ञात हो कि हस्ताक्षरित पूर्णांक अतिप्रवाह के मामलों में, यह तकनीकी रूप से अपरिभाषित व्यवहार है। इसलिए यह संभव है trueकि वे वापस लौटें, भले ही वे कभी भी सख्त दो के पूरक न हों।
रहस्यपूर्ण

1
@AlvinWong हाँ एक स्पष्टीकरण अच्छा होगा
स्टीव

1
@ साइट: आप प्रदर्शित कर सकते हैं कि आपने सभी संयोजनों में सभी सामान्य संदिग्धों (-1, 0, 1, 2, और इसी तरह) की कोशिश की है, साथ ही छोटे शब्दों-आकारों के लिए समस्या को "हल" करने का आपका प्रयास है ( तीन बिट्स? चार बिट्स?)। यह निश्चित रूप से हमें समझाने में मदद करेगा कि हम किसी की मदद नहीं कर रहे हैं कि वे कुछ हासिल करें जो उन्होंने पहले खुद के लिए कमाने की कोशिश नहीं की थी। :)
सरनॉल्ड करें

4
@AlexLockwood जब मैंने पहली बार सवाल पोस्ट किया, तो मैंने इस सवाल को "होमवर्क" के रूप में टैग किया और लोगों को समस्या को हल करने में मदद करने के लिए सुराग देने के लिए कहा (जैसा कि "होमवर्क" टैग राज्यों का वर्णन है) और न केवल उत्तर दें। इसलिए मैंने स्पष्ट रूप से समस्या का सवाल पूछा :)
स्टीव

जवाबों:


237

विरोधाभास के लिए मान लें कि कुछ मौजूद है xऔर कुछ y(mod 2 n ) ऐसा है

~(x+y) == ~x + ~y

दो के पूरक द्वारा *, हम जानते हैं कि,

      -x == ~x + 1
<==>  -1 == ~x + x

इस परिणाम को देखते हुए, हमारे पास,

      ~(x+y) == ~x + ~y
<==>  ~(x+y) + (x+y) == ~x + ~y + (x+y)
<==>  ~(x+y) + (x+y) == (~x + x) + (~y + y)
<==>  ~(x+y) + (x+y) == -1 + -1
<==>  ~(x+y) + (x+y) == -2
<==>  -1 == -2

इसलिए, एक विरोधाभास। इसलिए, ~(x+y) != ~x + ~yसभी के लिए xऔर y(mod 2 n )।


* यह ध्यान रखना दिलचस्प है कि किसी के पूरक अंकगणित के साथ एक मशीन पर, समानता वास्तव में सभी के लिए सच है xऔर y। इसका कारण यह है एक के पूरक किया जा रहा है ~x = -x। इस प्रकार, ~x + ~y == -x + -y == -(x+y) == ~(x+y)


47
बेशक, सी को इस व्यवहार की आवश्यकता नहीं है; के रूप में यह दो के पूरक प्रतिनिधित्व की आवश्यकता नहीं है।
बिली ओनली

12
Btw, समानता किसी के पूरक के लिए सही है । सामान्य रूप से संख्या के लिए ऑपरेशन को वास्तव में परिभाषित नहीं किया जाता है, इसलिए संख्या के प्रतिनिधित्व के आधार पर अलग-अलग व्यवहार में जोड़ परिणामों के साथ नहीं।
न्हात्थ

9
केवल अहस्ताक्षरित पूर्णांकों के लिए समस्या को शांत किया जा सकता है और फिर दोनो पूरक बिल्कुल भी नहीं चल सकते हैं।
R .. गिटहब स्टॉप हेल्पिंग IC

5
और भी आसान है, IMHO: ~x == -(x+1), इसलिए ~(x+y) == ~x + ~yतात्पर्य -(x+y+1) == -(x+1) + -(y+1)निकलता है-1 == -2
BlueRaja - डैनी Pflughoeft

7
@ बिलियन, चिंता मत करो, मैं केवल मजाक कर रहा था और मैं सराहना करता हूं कि आपने इसका उल्लेख किया :)। मैं आपको उस दिन एक ड्रिंक खरीदकर दूंगा, जिसका सामना मैं एक ऐसी मशीन से करता हूं, जो किसी के पूरक अंकगणित को अंजाम देती है ... वह आवाज कैसी होती है? हाहा
एलेक्स लॉकवुड

113

दो का अनुपूरण

कंप्यूटर के विशाल बहुमत पर, यदि xपूर्णांक है, तो -xइस रूप में दर्शाया गया है ~x + 1। तुल्य, ~x == -(x + 1)। इस समीकरण को अपने समीकरण में जगह देना:

  • ~ x + ~ y == ~ (x + y)
  • - (x + 1) + - (y + 1) = - ((x + y) + 1)
  • -x - y - 2 = -x - y - 1
  • -2 = -1

जो एक विरोधाभास है, इसलिए ~x + ~y == ~(x + y)हमेशा गलत है


उस ने कहा, बच्चों को इंगित करेगा कि सी को दो के पूरक की आवश्यकता नहीं है, इसलिए हमें भी विचार करना चाहिए ...

एक के पूरक

में किसी के पूरक , -xबस के रूप में प्रस्तुत किया जाता है ~x। शून्य एक विशेष मामला है, जिसमें सभी -० ( +0) और सभी -१ (दोनों -0) के प्रतिनिधित्व हैं, लेकिन IIRC, C को +0 == -0अलग-अलग बिट पैटर्न होने पर भी आवश्यकता होती है , इसलिए यह एक समस्या नहीं होनी चाहिए। बस विकल्प के ~साथ -

  • ~ x + ~ y == ~ (x + y)
  • -x + (-y) = - (x + y)

जो है सच सभी के लिए xऔर y


13
एक जवाब के लिए +1 जो वास्तव में दोनों के पूरक और समान जमीन पर किसी के पूरक दोनों पर विचार करता है।
बजे एक CVn

13
@ dan04, +0 == -0। अंत में सी। :) में कुछ समझ में आता है
एलेक्स लॉकवुड

32

दोनों का ही सबसे दायीं ओर थोड़ा विचार करें xऔर y(आईई है। x == 13जो है 1101आधार 2 में, हम केवल पिछले बिट पर नजर डालेंगे, एक 1तो फिर वहाँ चार संभावित मामलों रहे हैं):

x = 0, y = 0:

LHS: ~ 0 + ~ 0 => 1 + 1 => 10
RHS: ~ (0 + 0) => ~ 0 = 1

x = 0, y = 1:

LHS: ~ 0 + ~ 1 => 1 + 0 => 1
RHS: ~ (0 + 1) => ~ 1 = = 0

x = 1, y = 0:

मैं इसे आपके ऊपर छोड़ दूंगा क्योंकि यह होमवर्क है (संकेत: यह एक्स और वाई स्वैप के साथ पिछले जैसा ही है)।

x = 1, y = 1:

मैं इस एक को तुम्हारे ऊपर छोड़ दूंगा।

आप यह दिखा सकते हैं कि दाएं हाथ हमेशा किसी भी संभावित इनपुट दिए गए समीकरण के बाएं हाथ की ओर और दाहिने हाथ की तरफ अलग-अलग होंगे, इसलिए आपने साबित किया है कि दोनों पक्ष समान नहीं हैं, क्योंकि उनके पास कम से कम एक बिट है जो फ़्लिप है एक दूसरे से।


27

यदि बिट्स की संख्या n है

~x = (2^n - 1) - x
~y = (2^n - 1) - y


~x + ~y = (2^n - 1) +(2^n - 1) - x - y =>  (2^n + (2^n - 1) - x - y ) - 1 => modulo: (2^n - 1) - x - y - 1.

अभी,

 ~(x + y) = (2^n - 1) - (x + y) = (2^n - 1) - x - y.

इसलिए, वे हमेशा 1 के अंतर के साथ असमान होंगे।


4
@nhahtdh और आप ~गैर-निश्चित चौड़ाई संख्या पर ऑपरेशन को कैसे परिभाषित करते हैं ?
हम्सटरजेन

1
मैंने इन उत्तर को बिट्स की संख्या के साथ दिया ताकि कक्षाओं में पढ़ाए जाने के साथ सहसंबंध बनाना आसान हो। ध्यान दें कि ~ x बिट्स की संख्या पर अत्यधिक निर्भर है, n, संख्या का प्रतिनिधित्व करने के लिए उपयोग किया जाता है। तो यह समझदारी से एक से चिपकना है, जब इस प्रयोगात्मक रूप से सत्यापित करने की कोशिश की जा रही है।
कार्तिक कुमार विश्वनाथन

1
@ हैम्स्टरगिन: मुझे पता है कि बिट्स की संख्या निर्धारित है, लेकिन मेरा कहना यह है कि यह उन राशि (8, 16, आदि) का होना जरूरी नहीं है।
न्हात्थ

1
वे मान हैं जिनके लिए उत्तर को सत्यापित करने के लिए एक कार्यक्रम लिखना आसान है। यह किसी भी n के लिए काम करता है, जब तक कि ~ x और ~ y उस दिए गए मेल से लिखे जाते हैं।
कार्तिक कुमार विश्वनाथन 2

1
@hamstergene: मुझे प्रमाण के साथ कोई समस्या नहीं है, बस यह संख्या गलत निहितार्थ देती है कि यह केवल उन मामलों के लिए काम करता है।
न्हात्थ

27

संकेत:

x + ~x = -1(मॉड 2 एन )

प्रश्न के लक्ष्य को मानते हुए अपने गणित (अपने पढ़ने-के-सी-विनिर्देशों कौशल के बजाय) का परीक्षण कर रहे हैं, यह आपको उत्तर के लिए मिलना चाहिए।


2
केवल दो पूरक मशीनों पर। (C मानक की आवश्यकता नहीं है)
Billy ONeal

12
@ बिली: यह "केवल दो-सशस्त्र लोगों के लिए" कहने जैसा है।
dan04

2
@ dan04: नहीं, यह नहीं है। मैं सभी हस्ताक्षरित परिमाण कहना पसंद करूंगा और जो लोग प्रतिनिधित्व करते हैं वे दुनिया से चले गए थे। लेकिन ऐसा कहना गलत होगा। सी मानक आपको उस धारणा को बनाने की अनुमति नहीं देता है; इसलिए मैं कहूंगा कि कोड जो यह धारणा बनाता है कि ज्यादातर समय खराब कोड है। (विशेष रूप से जब बिट ट्विडलिंग की तुलना में हस्ताक्षरित संख्याओं के साथ आम तौर पर गड़बड़ करने के बेहतर तरीके होते हैं, और विशेष रूप से जब अहस्ताक्षरित संख्याएं वैसे भी ज्यादातर समय एक बेहतर विकल्प होती हैं)
बिली ओनली

10

दोनों में और दो (और यहां तक ​​कि 42 के) पूरक में, यह साबित किया जा सकता है:

~x + ~y == ~(x + a) + ~(y - a)

अब चलो a = yऔर हमारे पास है:

~x + ~y == ~(x + y) + ~(y - y)

या:

~x + ~y == ~(x + y) + ~0

इसलिए दो के पूरक में ~0 = -1, प्रस्ताव गलत है।

किसी के पूरक में ~0 = 0, प्रस्ताव सत्य है।


7

डेनिस रिची की पुस्तक के अनुसार, सी डिफ़ॉल्ट रूप से दो के पूरक को लागू नहीं करता है। इसलिए, आपका प्रश्न हमेशा सही नहीं हो सकता है।


5

आज्ञा देना MAX_INTहो int द्वारा प्रतिनिधित्व किया 011111...111(हालांकि कई बिट्स हैं)। तब आप जानते हैं कि, ~x + x = MAX_INTऔर ~y + y = MAX_INTइसलिए, आप निश्चित रूप से जान पाएंगे कि अंतर ~x + ~yऔर क्या ~(x + y)है 1


5

C को इस बात की आवश्यकता नहीं है कि दो का पूरक वही है जो कार्यान्वित किया जाता है। हालाँकि, अहस्ताक्षरित पूर्णांक के लिए समान लॉजिक्स लागू किया जाता है। इस तर्क के तहत अंतर हमेशा 1 होगा!


3

बेशक, सी को इस व्यवहार की आवश्यकता नहीं है क्योंकि इसे दो के पूरक प्रतिनिधित्व की आवश्यकता नहीं है। उदाहरण के लिए, ~x = (2^n - 1) - xऔर ~y = (2^n - 1) - yयह परिणाम प्राप्त करेगा।


0

आह, मौलिक असतत गणित!

की जाँच करें डी मॉर्गन की विधि

~x & ~y == ~(x | y)

~x | ~y == ~(x & y)

बुलियन सबूत के लिए बहुत महत्वपूर्ण है!


सिर्फ सादा गलत। C + में इसके अलावा, * गुणा और बूलियन या या नहीं है।
नालपुरी

गलत संचालकों को इंगित करने के लिए, धन्यवाद। इसे अब सही ऑपरेटरों के साथ अपडेट किया गया है, हालाँकि आप इस बात में सही हैं कि यह मूल प्रश्न पर लागू नहीं होता है।
डेविड कैक्ज़िनस्की

1
खैर, अगर सच एक है और झूठा शून्य है, तो + और * बिल्कुल और जैसा व्यवहार करते हैं, और, इसके अलावा दो का पूरक व्यवहार नहीं करता है, इसलिए कानून फिर भी लागू होता है।
1

उस ओर इशारा करने के लिए धन्यवाद, a1an। मैं यह सोचने की कोशिश कर रहा था कि डी मॉर्गन के नियम अभी भी मूल प्रश्न पर कैसे लागू हो सकते हैं, लेकिन मुझे प्रोग्रामिंग या डिस्क्रीट गणित का अध्ययन किए हुए कई साल हो चुके हैं।
डेविड कैक्ज़िनस्की
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.