क्यों bitwise ऑपरेशन (~0);
प्रिंट -1? बाइनरी में, 0 नहीं होना चाहिए 1। क्यूं कर ?bitwise ऑपरेटर नहीं
उत्तर
आप वास्तव में काफी करीब हैं।
द्विआधारी में, न 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
"
- "है कि ध्यान दें, सभी मामलों में,
क्योंकि ~
बाइनरी उलटा नहीं है, यह थोड़ा सा उलटा है। बाइनरी इनवर्जन !
होगा और जावा (जावा में) केवल बूलियन मानों पर लागू किया जा सकता है।
मानक बाइनरी एन्कोडिंग में, 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
यह द्विआधारी उलट है, और दूसरा पूरक में -1 है 0.
की बाइनरी उलट ~ 0x00000000 क्या आप वास्तव में क्या कह रहे हैं और कहा कि 0xFFFFFFFF में परिणाम है। जावा में एक (हस्ताक्षरित) int के लिए, इसका मतलब है -1।
~
थोड़ा सा ऑपरेटर है।
~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 = -1280 1 1 1 1 1 1 0 = 126
1 0 0 0 0 1 = -1271 1 1 1 1 1 1 1 = -1
0 0 0 0 0 0 0 0 = 01 1 1 1 1 1 1 0 = -2
0 0 0 0 0 0 0 1 = 11 0 0 0 0 0 0 1 = -127
0 1 1 1 1 1 1 0 = 1261 0 0 0 0 0 0 0 = -128
0 1 1 1 1 1 1 1 = 127
+1। प्रोग्रामर जो पहेली करना पसंद करते हैं, यह पता लगा सकते हैं कि ~ कैसे काम करता है और कैसे दो पूरक आपके उदाहरण का ध्यानपूर्वक अध्ययन करने से काम करता है! –
0 यहां कुछ नहीं है। (00000000. बिटवाइज़ का उपयोग करना या हम 11111111. होगा यह है -1 के रूप में पूर्णांक पर हस्ताक्षर किए ...
32 बिट के साइन्ड इंटीजर
~00000000000000000000000000000000=11111111111111111111111111111111
के लिए है जो - -; यह एक बाइट है (या अधिक कम से कम) 1)
आप एक हस्ताक्षरित संख्या में पहली बिट की कल्पना कर सकते हैं - (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!
अधिक स्पष्ट उदाहरण, धन्यवाद! –
मुझे लगता है कि असली कारण यह है कि ~ दो के पूरक है।
जावास्क्रिप्ट दो के पूरक के लिए चरित्र टिल्डे, ~ को नामित करता है, भले ही अधिकांश प्रोग्रामिंग भाषाओं में टिल्डे किसी के पूरक के लिए थोड़ा टॉगल का प्रतिनिधित्व करता है।
यदि आप एक बिट को फ़्लिप करना चाहते हैं, तो 'x^1' का उपयोग करें। – kennytm
यह 'नहीं' ऑपरेटर नहीं है। यह एक 'पूरक' ऑपरेटर है। – EJP
@EJP: ए *** एक *** पूरक ऑपरेटर। – kennytm