2012-11-23 12 views
11

मैंने हाल ही में जावा कोर्स (1 सप्ताह का क्रैश कोर्स) किया है, और हमने कुछ बाइनरी गणित को कवर किया है।यूनरी "~" ऑपरेटर - वास्तव में क्या हो रहा है?

यह एकल ~ ऑपरेटर (टिल्ड मुझे लगता है कि यह कहा जाता है?) इस प्रकार हमें समझाया गया था:

यह में थोड़ा पैटर्न एक "1" और हर "1" में बदल हर "0" उलट एक " 0 "। उदा। एक बाइट के लिए 8 बिट्स हैं। यदि आपके पास निम्न बाइट है: 00000000 उलटा मूल्य 11111111 बन जाएगा।

उपर्युक्त स्पष्टीकरण स्पष्ट और संक्षेप में है, और पूरी तरह से मुझे समझ में आता है। जब तक, मैं इसे लागू करने की कोशिश नहीं करता।

को देखते हुए यह:

byte x = 3; 
byte y = 5; 
System.out.println(~x); 
System.out.println(~y); 

उत्पादन होता है:

-4 
-6 

मैं बहुत कि यह कैसे होता बारे में उलझन में हूँ।

यदि बाइनरी में +3 11 है, तो इसका उलटा 00 होगा, जो स्पष्ट रूप से -3 नहीं है।

लेकिन जैसा कि बाइट में 8 बिट्स हैं, तो 0030011 के रूप में +3 के द्विआधारी प्रतिनिधित्व को नहीं लिखा जाना चाहिए?

जो 11111100 बनने के लिए उलटा होगा। दशमलव मान में वापस परिवर्तित किया जाएगा यह 252 होगा। यदि आप +3 के रूप में +3 लिखते हैं, तो यह वास्तव में 100 में परिवर्तित होता है, जो +4 है, लेकिन फिर आप कैसे करते हैं पता है कि यह एक नकारात्मक संख्या है?

यदि आप 0011 का प्रयास करते हैं, जो 1100 में परिवर्तित होता है, जो कि यदि आप पहली बिट को साइन के रूप में उपयोग करते हैं, तो यह वास्तव में -4 बन जाता है।

आह - इसलिए इस बिंदु पर मैंने सोचा कि मैं कहीं और हो रहा था।

लेकिन तब मैं = y के दूसरे मूल्य 5.

हम इस लिख सकता हूँ कैसे मिल गया? एक ही तर्क का उपयोग करते हुए, +5 बाइनरी 0101 में परिवर्तित हो जाता है, जो 1010 में बदल जाता है।

और अब यह है कि मैं बहुत उलझन में हूं। यह या तो 2 के हस्ताक्षरित मान, या +10 दशमलव के एक हस्ताक्षरित मान का प्रतिनिधित्व करने के लिए लग रहा है? इनमें से कोई भी नहीं -6 मैं मुद्रित हो रहा हूं।

फिर, यदि मैं बाइट के 8 अंकों तक लम्बाई बढ़ाता हूं, तो +5 00000101 है, जो उलटा हुआ 11111010 हो जाता है। और मुझे वास्तव में इसे -6 में बदलने का कोई तरीका नहीं मिल रहा है।

क्या कोई इसे समझता है, क्योंकि मुझे नहीं पता कि यहां क्या हो रहा है और जितना अधिक संख्या मैं अधिक भ्रमित हूं, मैं बनता हूं। शायद यह थोड़ा ऑपरेटर संकेत को देखकर पसंद नहीं है .. देखें इस प्रदर्शन :-(

+2

जावा में सभी अभिन्न संख्यात्मक प्रकार * हस्ताक्षरित * हैं। –

+2

@MarkoTopolnik char एक संख्यात्मक प्रकार है, और हस्ताक्षरित है। –

+0

2 के पूरक होने के बारे में सभी बहुत ही उपयोगी उत्तर देने के बाद, मुझे यह वीडियो मिला जो इसे काफी अच्छी तरह से समझाता है। सभी उत्तर देने वालों का धन्यवाद। http://www.youtube.com/watch?v=Hof95YlLQk0&NR=1&feature=endscreen –

उत्तर

4

विकिपीडिया से: दो के पूरक नोटेशन में, एक गैर-ऋणात्मक संख्या को इसके सामान्य द्विआधारी प्रतिनिधित्व द्वारा दर्शाया जाता है; इस मामले में, सबसे महत्वपूर्ण बिट 0 है। दोनों का पूरक ऑपरेशन अस्वीकरण ऑपरेशन है, इसलिए नकारात्मक संख्याओं को पूर्ण मूल्य के दो पूरक के द्वारा दर्शाया जाता है।
द्विआधारी संख्या के दो पूरक के लिए, बिट्स उलटा हुआ है, या "flipped", bitwise नहीं ऑपरेशन का उपयोग करके; 1 के मान को तब परिणामी मान में जोड़ा जाता है, जो दो के पूरक 0 http://en.wikipedia.org/wiki/Two%27s_complement

तो यदि आपके पास 0101 है जो +5 है, तो इसके विपरीत 1010 है, जो -5 है ।

आप वास्तव में 010 को 5 के रूप में नहीं पढ़ते हैं, लेकिन जब आप शुरुआत में 1 को देखते हैं, तो आप जानते हैं कि आपको संख्या को फिर से प्राप्त करने के लिए शेष संख्याओं को सकारात्मक संख्या प्राप्त करने के लिए आप अस्वीकार करना चाहते हैं। यदि इसका कोई औचित्य हो।

यदि आप इससे पहले काम नहीं करते हैं तो यह एक विदेशी अवधारणा है। निश्चित रूप से यह नहीं है कि दशमलव संख्याएं काम करती हैं, लेकिन यह देखने के बाद वास्तव में यह आसान होता है कि क्या हो रहा है।

8 दशमलव मान जो नकारता 10101. को पहला अंक (1) मतलब है कि यह नकारात्मक है, और फिर आप बाकी वापस फ्लिप संख्यात्मक मान प्राप्त करने के लिए 01010 के रूप में लिखा है,: 1010

एक बात याद रखना है कि दो का पूरक सामान्य पुरानी बाइनरी प्रणाली गिनती जैसा नहीं है। सामान्य बाइनरी में 10101 का मूल्य (जो कि दो पूरक में -8 जैसा ऊपर है) निश्चित रूप से 21 है। मुझे लगता है कि यह वह जगह है जहां भ्रम आता है - आप उन्हें देखकर अंतर कैसे बताते हैं? यह तय करने के लिए कि वास्तव में संख्या का मूल्य क्या है, आपको यह पता होना चाहिए कि किस प्रतिनिधित्व का उपयोग किया गया है। एक पूरक भी है जो थोड़ा अलग है।

वन और दो पूरक सहित बाइनरी गणित पर एक अच्छा ट्यूटोरियल यहां दिया गया है। http://www.math.grin.edu/~rebelsky/Courses/152/97F/Readings/student-binary

+0

ओह मैं देखता हूं। मैं उन्हें सकारात्मक संख्याओं के समान पढ़ने की कोशिश कर रहा था, लेकिन सामने 1 के साथ। उसके लिए धन्यवाद। लिंक के लिए भी - वे शानदार हैं। मैं अंततः इसे समझ गया। मुझे लगता है। :-) –

+0

मैं इसे जोड़ना चाहता हूं, यह सब 32 बिट मानों में होता है। इसलिए, जब आपने 3 कहा, तो यह वास्तव में बाइनरी 0000000000000000000000000000000011 में था। जब आपने उलटा किया तो यह 11111111111111111111111111111100 बन गया जो कि दो के पूरक 32 बिट शब्द में -4 के बराबर है। –

7

: - -

गूगल इस पर काफी कुछ भी साथ आने के लिए प्रतीत नहीं होता

3 -> 0011 
~3 -> 1100 -> -4 (2's complement) 

5 -> 0101 
~5 -> 1010 -> -6 (2's complement) 

चूंकि हस्ताक्षरित पूर्णांक 2 के पूरक के रूप में संग्रहीत किए जाते हैं, 2's complement1100 आपको 4 देता है। अब 1100 एक नकारात्मक संख्या है।तो, परिणाम -4 है। 1010 के साथ ही मामला है।

1100 
0011 - 1's complement 
0100 - 2's complement - value = 4 (take negative) 
+1

इसके अतिरिक्त, ध्यान दें कि bitwise पूरक ऑपरेटर यूनरी संख्यात्मक पदोन्नति करता है। –

+0

2 का पूरक। हम्म। हमारे ट्रेनर ने उस बिट का जिक्र नहीं किया। Google के पास मैं जाता हूं। धन्यवाद। :-) –

2

हस्ताक्षर पूर्णांकों लगभग सार्वभौमिक twos complement का उपयोग कर जमा हो जाती है। इसका मतलब बिट्स को बदलना (किसी के पूरक को लेना) और एक जोड़ना है। इस तरह आपके पास पूर्णांक शून्य (+0 और -0) के दो प्रस्तुतियां नहीं हैं, और कुछ हस्ताक्षरित संचालन हार्डवेयर में लागू करना आसान हो जाता है।

2

जावा Two's complement में हस्ताक्षरित संख्याओं का उपयोग करता है। "Unsigned int" या "unsigned char" के रूप में प्रकारों का उपयोग करते समय आपका तर्क सी या अन्य भाषाओं में सही होगा।

संबंधित मुद्दे