2010-03-25 27 views
34

क्यों bitwise ऑपरेशन (~0); प्रिंट -1? बाइनरी में, 0 नहीं होना चाहिए 1। क्यूं कर ?bitwise ऑपरेटर नहीं

+7

यदि आप एक बिट को फ़्लिप करना चाहते हैं, तो 'x^1' का उपयोग करें। – kennytm

+1

यह 'नहीं' ऑपरेटर नहीं है। यह एक 'पूरक' ऑपरेटर है। – EJP

+1

@EJP: ए *** एक *** पूरक ऑपरेटर। – kennytm

उत्तर

64

आप वास्तव में काफी करीब हैं।

द्विआधारी में, न 0 1

हाँ, यह बिल्कुल सही है होना चाहिए जब हम के बारे में एक सा बात कर रहे हैं।

हाउवर, int जिसका मूल्य 0 है वास्तव में सभी शून्यों के 32 बिट्स हैं! ~ सभी 32 शून्यों को 32 में बदल देता है।

System.out.println(Integer.toBinaryString(~0)); 
// prints "11111111111111111111111111111111" 

यह -1 के दो के पूरक प्रतिनिधित्व है।

इसी

:

System.out.println(Integer.toBinaryString(~1)); 
// prints "11111111111111111111111111111110" 

यही है, एक दो के पूरक प्रतिनिधित्व, ~1 == -2 में अहस्ताक्षरित int 32-बिट के लिए।


अतिरिक्त पठन:

  • Two's complement
    • यह बिट्स में संख्यात्मक मूल्य पर हस्ताक्षर किए प्रतिनिधित्व करने के लिए (दूसरों के बीच) जावा सिस्टम है जिसका प्रयोग
  • JLS 15.15.5 Bitwise complement operator ~
    • "है कि ध्यान दें, सभी मामलों में, ~x के बराबर होती है (-x)-1"
3

क्योंकि ~ बाइनरी उलटा नहीं है, यह थोड़ा सा उलटा है। बाइनरी इनवर्जन ! होगा और जावा (जावा में) केवल बूलियन मानों पर लागू किया जा सकता है।

1

मानक बाइनरी एन्कोडिंग में, 0 सभी 0s, ~ बिटवाई नहीं है। हस्ताक्षर पूर्णांक प्रकारों के लिए सभी 1s (अक्सर अक्सर) -1 है। तो एक हस्ताक्षरित बाइट प्रकार के लिए:

0xFF = -1 // 1111 1111 
0xFE = -2 // 1111 1110 
... 
0xF0 = -128 // 1000 0000 
0x7F = 127 // 0111 1111 
0x7E = 126 // 0111 1110 
... 
0x01 = 1  // 0000 0001 
0x00 = 0  // 0000 0000 
0

यह द्विआधारी उलट है, और दूसरा पूरक में -1 है 0.

13

की बाइनरी उलट ~ 0x00000000 क्या आप वास्तव में क्या कह रहे हैं और कहा कि 0xFFFFFFFF में परिणाम है। जावा में एक (हस्ताक्षरित) int के लिए, इसका मतलब है -1।

7

~ थोड़ा सा ऑपरेटर है।

~0 = 1 which is -1 in 2's complement form 

http://en.wikipedia.org/wiki/Two's_complement

दो के पूरक के रूप में कुछ संख्या और उनके बिट के लिहाज से नहीं ~ (सिर्फ उन्हें नीचे):

0 1 1 1 1 1 1 1 = 127
1 0 0 0 0 0 0 = -128

0 1 1 1 1 1 1 0 = 126
1 0 0 0 0 1 = -127

1 1 1 1 1 1 1 1 = -1
0 0 0 0 0 0 0 0 = 0

1 1 1 1 1 1 1 0 = -2
0 0 0 0 0 0 0 1 = 1

1 0 0 0 0 0 0 1 = -127
0 1 1 1 1 1 1 0 = 126

1 0 0 0 0 0 0 0 = -128
0 1 1 1 1 1 1 1 = 127

+0

+1। प्रोग्रामर जो पहेली करना पसंद करते हैं, यह पता लगा सकते हैं कि ~ कैसे काम करता है और कैसे दो पूरक आपके उदाहरण का ध्यानपूर्वक अध्ययन करने से काम करता है! –

0

0 यहां कुछ नहीं है। (00000000. बिटवाइज़ का उपयोग करना या हम 11111111. होगा यह है -1 के रूप में पूर्णांक पर हस्ताक्षर किए ...

0

32 बिट के साइन्ड इंटीजर

~00000000000000000000000000000000=11111111111111111111111111111111 के लिए है जो - -; यह एक बाइट है (या अधिक कम से कम) 1)

9

आप एक हस्ताक्षरित संख्या में पहली बिट की कल्पना कर सकते हैं - (2 x -1) जहां x बिट्स की संख्या है।

तो, एक 8 बिट संख्या, प्रत्येक बिट का मान (में सही क्रम से दाएं) दिया जाता है:

-128 64 32 16 8 4 2 1 

अब, बाइनरी में, 0 स्पष्ट रूप से सभी 0s है:

-128 64 32 16 8 4 2 1 
0  0 0 0 0 0 0 0 0 = 0 

और जब आप बिटवाइज़ नहीं ~ कर इन 0s के प्रत्येक हो जाता है एक 1:

 -128 64 32 16 8 4 2 1 
~0  1 1 1 1 1 1 1 1 
= -128+64+32+16+8+4+2+1 == -1 

यह भी उपयोगी मैं है एन समझ ओवरफ्लो:

 -128 64 32 16 8 4 2 1 
126  0 1 1 1 1 1 1 0 = 126 
+1  0 1 1 1 1 1 1 1 = 127 
+1  1 0 0 0 0 0 0 0 = -128 overflow! 
+0

अधिक स्पष्ट उदाहरण, धन्यवाद! –

0

मुझे लगता है कि असली कारण यह है कि ~ दो के पूरक है।

जावास्क्रिप्ट दो के पूरक के लिए चरित्र टिल्डे, ~ को नामित करता है, भले ही अधिकांश प्रोग्रामिंग भाषाओं में टिल्डे किसी के पूरक के लिए थोड़ा टॉगल का प्रतिनिधित्व करता है।

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

  • कोई संबंधित समस्या नहीं^_^