एक लाइन में
नंबर बेस कन्वर्जन एक नंबर को एक गिनती सिस्टम (जैसे हमारा जाना-पहचाना दस अंकों वाला डेसीमल) से दूसरे सिस्टम (जैसे कंप्यूटर का अपना दो अंकों वाला बाइनरी) में बदलने की कला है, बिना उसकी असली वैल्यू बदले।
यह क्या प्रॉब्लम सॉल्व करता है
इंसानों की, ज़्यादातर, दस उंगलियां होती हैं। इस बायोलॉजिकल हार्डवेयर ने दस के ग्रुप में गिनती करना—यानी डेसीमल या बेस-10 सिस्टम—को बहुत स्वाभाविक बना दिया। हमारे पास दस यूनिक सिंबल (0 से 9 तक) हैं, और जैसे ही हम नौ पर पहुँचते हैं, हम पलट जाते हैं: हम बाईं ओर एक नया अंक जोड़ते हैं और वापस शून्य से शुरू करते हैं। दस 10 है, एक सौ 100 है, और इसी तरह। एकदम मक्खन।
दूसरी ओर, कंप्यूटरों की "उंगलियां" अलग होती हैं। उनका मूल हार्डवेयर ट्रांजिस्टर है, एक माइक्रोस्कोपिक स्विच जो या तो ऑन हो सकता है या ऑफ। बस। दो ही स्टेट्स। यह दो-सिंबल सिस्टम—बाइनरी या बेस-2—को कंप्यूटर की मूल भाषा बनाता है। दो सिंबल हैं 0 (ऑफ) और 1 (ऑन)।
इससे एक ट्रांसलेशन की समस्या पैदा होती है। एक कंप्यूटर के लिए, इंसानी नंबर 237 का कोई मतलब नहीं है। इसे ऑन और ऑफ की एक सीरीज़ के रूप में दिखाना ज़रूरी है। वही नंबर, 237, बाइनरी में 11101101 होता है।
जहाँ कंप्यूटर बाइनरी में माहिर होते हैं, वहीं इंसान... नहीं होते। वन्स (ones) और ज़ीरोज़ (zeros) की एक लंबी स्ट्रिंग पढ़ना सिरदर्द और आँखों पर ज़ोर डालने का पक्का नुस्खा है। इस गैप को भरने के लिए, डेवलपर्स ने सुविधाजनक शॉर्टहैंड बनाए: ऑक्टल (बेस-8) और हेक्साडेसिमल (बेस-16)। इन "दो की पावर" वाले बेसेज़ को बाइनरी से कन्वर्ट करना या बाइनरी में कन्वर्ट करना बच्चों का खेल है, लेकिन वे लंबी बाइनरी स्ट्रिंग्स को बहुत ज़्यादा पठनीय हिस्सों में कंप्रेस कर देते हैं।
नंबर बेस इस बुनियादी मिसमैच को सॉल्व करने के लिए मौजूद हैं कि इंसान नंबरों के बारे में कैसे सोचते हैं और मशीनें उन्हें फिजिकली कैसे स्टोर करती हैं। वे वो रोसेटा स्टोन हैं जो हमें वन्स और ज़ीरोज़ के समुद्र में खोए बिना मशीन के दिमाग में झाँकने देते हैं।
यह अंदर से कैसे काम करता है
किसी भी नंबर बेस के पीछे का जादू पोजिशनल नोटेशन नामक कॉन्सेप्ट है। एक अंक की पोजीशन उसकी वैल्यू तय करती है। चलिए इसे तोड़कर समझते हैं।
ये "बेस" आखिर है क्या?
अपनी कार के ओडोमीटर के बारे में सोचें। जब सबसे दाईं ओर का अंक 9 से 0 होता है, तो उसके बाईं ओर का अंक एक से बढ़ जाता है। हर अंक की "जगह" दस की पावर को रिप्रेजेंट करती है।
हमारे रोज़मर्रा के बेस-10 सिस्टम में 427 नंबर का वास्तव में मतलब है:
4सौ (4 × 10²)2दहाई (2 × 10¹)7इकाई (7 × 10⁰)
इन्हें जोड़ें: 400 + 20 + 7 = 427.
"बेस" बस वह नंबर है जिसे हम हर पोजीशन के लिए पावर में बढ़ा रहे हैं। बेस-10 के लिए, यह 10 है। बाइनरी (बेस-2) के लिए, यह 2 है। हेक्साडेसिमल (बेस-16) के लिए, यह 16 है। फॉर्मूला वही है, केवल बेस (b) बदलता है:
... + (digit × b²) + (digit × b¹) + (digit × b⁰)
हमारी दुनिया (डेसीमल) से उनकी दुनिया (कोई भी बेस) तक
चलिए हमारे डेसीमल नंबर 427 को बाइनरी (बेस-2) में बदलते हैं। एल्गोरिथ्म है "टार्गेट बेस से लगातार डिवाइड करो और शेष (remainder) को रिकॉर्ड करो।"
| डिवीज़न | रिज़ल्ट | शेष (Remainder) |
|---|---|---|
| 427 ÷ 2 | 213 | 1 |
| 213 ÷ 2 | 106 | 1 |
| 106 ÷ 2 | 53 | 0 |
| 53 ÷ 2 | 26 | 1 |
| 26 ÷ 2 | 13 | 0 |
| 13 ÷ 2 | 6 | 1 |
| 6 ÷ 2 | 3 | 0 |
| 3 ÷ 2 | 1 | 1 |
| 1 ÷ 2 | 0 | 1 |
अब, शेष (remainders) को नीचे से ऊपर की ओर पढ़ें।
तो, डेसीमल 427 बाइनरी में 110101011 है।
यह मेथड किसी भी बेस के लिए काम करता है। 427 को हेक्साडेसिमल (बेस-16) में बदलने के लिए, आप बस 16 से डिवाइड करें। (ध्यान दें: बेस-16 में, हमें 10 से ज़्यादा सिंबल चाहिए, इसलिए हम 10 के लिए A, 11 के लिए B, ..., 15 के लिए F का उपयोग करते हैं)।
427 ÷ 16 = 26शेष11(जो हेक्स मेंBहै) के साथ।26 ÷ 16 = 1शेष10(जो हेक्स मेंAहै) के साथ।1 ÷ 16 = 0शेष1के साथ।
नीचे से ऊपर पढ़ने पर हमें 1AB मिलता है। तो, डेसीमल 427 हेक्स में 1AB है।
उनकी दुनिया (कोई भी बेस) से वापस हमारी दुनिया (डेसीमल) में
उल्टा जाने के लिए, हम उस पोजिशनल नोटेशन फॉर्मूले का उपयोग करते हैं जो हमने पहले देखा था। चलिए बाइनरी 110101011 को वापस डेसीमल में बदलते हैं। हम हर अंक को 2 की पावर से गुणा करते हैं, जो उसकी पोजीशन के अनुसार होती है (दाईं ओर से 0 से शुरू होकर)।
1 * 2^8 = 256
+ 1 * 2^7 = 128
+ 0 * 2^6 = 0
+ 1 * 2^5 = 32
+ 0 * 2^4 = 0
+ 1 * 2^3 = 8
+ 0 * 2^2 = 0
+ 1 * 2^1 = 2
+ 1 * 2^0 = 1
----------------
Total = 427
काम कर गया! चलिए इसे हेक्स 1AB के साथ आजमाते हैं:
1 * 16^2 = 256
+ A * 16^1 = (10 * 16) = 160
+ B * 16^0 = (11 * 1) = 11
-------------------------
Total = 427
और बूम! नंबर वही, बस पहनावा अलग।
हेक्स और ऑक्टल का शॉर्टकट
तो फिर हेक्स और ऑक्टल की जहमत क्यों उठाएं? क्योंकि वे "दो-की-पावर" वाले बेस हैं।
- ऑक्टल बेस-8 है, और 8 = 2³। इसका मतलब है कि हर एक ऑक्टल अंक तीन बाइनरी अंकों के ग्रुप से पूरी तरह मेल खाता है।
- हेक्स बेस-16 है, और 16 = 2⁴। इसका मतलब है कि हर एक हेक्स अंक चार बाइनरी अंकों के ग्रुप (जिसे "निबल" कहते हैं) से पूरी तरह मेल खाता है।
चलिए एक बड़ा बाइनरी नंबर लेते हैं: 1101011101001111
इसे पढ़ने के लिए, एक इंसान को हर अंक को स्कैन करना होगा। लेकिन इसे हेक्स में बदलने के लिए, आप बस इसे दाईं ओर से चार के ग्रुप में बाँट दें:
1101 | 0111 | 0100 | 1111
अब, हर हिस्से को कन्वर्ट करें:
1101होता है8+4+0+1 = 13, जो किDहै0111होता है0+4+2+1 = 70100होता है0+4+0+0 = 41111होता है8+4+2+1 = 15, जो किFहै
तो, 1101011101001111 हेक्स में बस D74F है। बहुत ज़्यादा पठनीय और कम गलती की गुंजाइश। यह सिर्फ एक कैलकुलेशन नहीं है; यह एक सीधा ट्रांसक्रिप्शन है। यही कारण है कि डेवलपर्स हेक्साडेसिमल को पसंद करते हैं: यह बाइनरी डेटा के लिए एकदम सही मानव-पठनीय रैपर है।
असल दुनिया की कहानियाँ
रहस्यमयी रंग का मामला
एक जूनियर फ्रंट-एंड डेवलपर को एक UI डिज़ाइनर से एक डिज़ाइन मॉकअप मिलता है। ब्रांड का प्राइमरी कलर #E63946 के रूप में लिस्टेड है। डेवलपर जानता है कि यह लाल रंग का एक शेड है, लेकिन कितना लाल? और बाकी रंगों का क्या? वे हेक्स कोड को एक कन्वर्टर में डालते हैं। E63946 वास्तव में तीन अलग-अलग हेक्स नंबर हैं: E6 लाल के लिए, 39 हरे के लिए, और 46 नीले के लिए।
- हेक्स में
E6डेसीमल में230में बदल जाता है। ठीक है, तो यह बहुत सारा लाल है (अधिकतम 255 में से)। - हेक्स में
39डेसीमल में57में बदल जाता है। थोड़ा सा हरा। - हेक्स में
46डेसीमल में70में बदल जाता है। थोड़ा सा नीला।
हेक्स कोड को तोड़कर, डेवलपर रंग की संरचना को समझता है। यह सिर्फ "लाल" नहीं है, यह "ज़्यादातर लाल है, जिसमें थोड़ा, समान मात्रा में हरा और नीला है ताकि यह कम तीखा लगे।"
सबक: हेक्साडेसिमल वेब पर रंगों की भाषा है। इसे समझने से आप कोड कॉपी-पेस्ट करने से आगे बढ़कर उन रंगों को सही में समझ पाते हैं जिनके साथ आप काम कर रहे हैं।
फाइलसिस्टम परमिशन की पहेली
एक sysadmin एक लिनक्स सर्वर पर एक नई अपलोड की गई स्क्रिप्ट, deploy.sh को सुरक्षित करने की कोशिश कर रहा है। उन्हें ज़रूरत है कि ओनर (owner) इसे पढ़, लिख और एक्सेक्यूट कर सके, लेकिन ग्रुप और बाकी सभी इसे केवल पढ़ और एक्सेक्यूट कर सकें। उन्होंने chmod 755 deploy.sh कमांड को हर जगह इस्तेमाल होते देखा है, लेकिन उन्होंने हमेशा इसे एक जादुई मंत्र की तरह ही माना है।
इस बार, वे इसे देखते हैं। नंबर 755 ऑक्टल है। यह परमिशन के तीन सेट को रिप्रेजेंट करता है: ओनर, ग्रुप और अन्य (Others)।
- ओनर की परमिशन
7है। बाइनरी में,7111है। - ग्रुप की परमिशन
5है। बाइनरी में,5101है। - "अन्य" की परमिशन
5है। बाइनरी में,5101है।
प्रत्येक बाइनरी अंक एक विशिष्ट परमिशन से मेल खाता है: रीड (r), राइट (w), और एक्सेक्यूट (x)।
111का मतलब हैrwx(रीड, राइट, एक्सेक्यूट सभी ऑन हैं)।101का मतलब हैr-x(रीड और एक्सेक्यूट ऑन हैं, राइट ऑफ है)।
तो, chmod 755 परमिशन को rwxr-xr-x पर सेट करता है, जो ठीक वही था जो चाहिए था। रहस्य सुलझ गया।
सबक: ऑक्टल फ़ाइल परमिशन को मैनेज करने के लिए एक सुपर-संक्षिप्त शॉर्टहैंड प्रदान करता है, जो मूल रूप से ऑन/ऑफ फ्लैग (बिट्स) का एक सेट है।
बिट-फ्लिपिंग बग
एक डेवलपर जो एक स्मार्ट थर्मोस्टेट के लिए एक एम्बेडेड सिस्टम बना रहा है, उसे डिवाइस सेटिंग्स को मेमोरी के एक छोटे से हिस्से में सहेजना है। जगह बचाने के लिए, वे एक सिंगल बाइट (8 बिट) को "फ्लैग रजिस्टर" के रूप में उपयोग करते हैं। प्रत्येक बिट एक सेटिंग को रिप्रेजेंट करता है: isHeating, isCooling, fanOn, hasWifiConnection, आदि।
एक दिन, बग रिपोर्ट की बाढ़ आ जाती है: "जब मैं पंखा चालू करता हूं, तो हीट भी चालू हो जाती है!" डेवलपर हैरान है। पंखा चालू करने का कोड सही लगता है। लेकिन जब वे मेमोरी में सेटिंग्स बाइट का निरीक्षण करते हैं, तो उन्हें समस्या दिखाई देती है। मान लीजिए कि पंखा दूसरा बिट है (वैल्यू 2¹ = 2) और हीट तीसरा बिट है (वैल्यू 2² = 4)। कोड को बाइट को ...010 (पंखा ऑन) पर सेट करना था। इसके बजाय, यह इसे ...110 (पंखा ऑन और हीट ऑन) पर सेट कर रहा था। डेसीमल वैल्यू 2 के बजाय 6 होती, जो तुरंत स्पष्ट नहीं होती। लेकिन बाइनरी रिप्रेजेंटेशन 00000110 को देखने से समस्या क्रिस्टल क्लियर हो गई: एक के बजाय दो बिट्स फ्लिप हो रहे थे। एक दोषपूर्ण बिटवाइज़ ऑपरेशन इसका कारण था।
सबक: लो-लेवल प्रोग्रामिंग, मेमोरी डीबगिंग, या हार्डवेयर रजिस्टरों के साथ काम करने के लिए, बाइनरी में सोचना वैकल्पिक नहीं है—यह एकमात्र तरीका है यह देखने का कि वास्तव में क्या हो रहा है।
आम गलतियाँ और जाल
- अपने प्रीफिक्स भूल जाना। कई प्रोग्रामिंग भाषाओं (जैसे C, Java, या JavaScript) में,
0से शुरू होने वाले नंबर को ऑक्टल माना जाता है।010दस नहीं, आठ है!0xसे शुरू होने वाला नंबर हेक्साडेसिमल है।0x10सोलह है। यह न जानने से कुछ वाकई अजीबोगरीब बग्स हो सकते हैं। O/0औरI/1में कन्फ्यूज होना। जब आप लंबी हेक्स या बाइनरी स्ट्रिंग्स को घूर रहे होते हैं, तो आपकी आँखों का चौंधिया जाना औरOअक्षर को शून्य, याIको एक समझने की गलती करना आसान होता है। हेक्स मेंOयाIका उपयोग नहीं होता है, लेकिन अन्य बेस कन्वर्जन में हो सकता है, और यह एक क्लासिक "fat-finger" एरर है।- 16 से बड़े बेस के लिए एक स्टैण्डर्ड मान लेना। बाइनरी (0-1), ऑक्टल (0-7), डेसीमल (0-9), और हेक्स (0-9, A-F) के कैरेक्टर मानकीकृत हैं। लेकिन बेस-22 या बेस-36 के बारे में क्या? ज़्यादातर सिस्टम
0-9के बादA-Zका उपयोग करते हैं, लेकिन यह कोई सार्वभौमिक नियम नहीं है। कम कॉमन बेसेज़ से निपटते समय हमेशा उपयोग किए जा रहे कैरेक्टर सेट (या "अल्फाबेट") को वेरीफाई करें। - इंटीजर लिमिट्स को अनदेखा करना। एक 64-बिट हेक्स नंबर जैसे
0x7FFFFFFFFFFFFFFFएक विशाल संख्या को रिप्रेजेंट करता है। यदि आप इसे कन्वर्ट करने और अपने प्रोग्राम में एक स्टैण्डर्ड 32-बिट इंटीजर वेरिएबल में स्टोर करने का प्रयास करते हैं, तो यह फिट नहीं होगा। इससे "इंटीजर ओवरफ्लो" होगा, जहाँ नंबर घूमकर एक नेगेटिव वैल्यू बन जाता है या एक एरर फेंकता है।
यह आपके रडार पर क्यों होना चाहिए
भले ही आप एक लो-लेवल C प्रोग्रामर न हों, आप लगातार विभिन्न नंबर बेसेज़ से टकराएंगे। आपको इनके बारे में सोचना चाहिए जब भी आप:
- CSS में या एक डिजाइन टूल से एक रंग चुन रहे हों (
#RRGGBB)। - API कीज़ या Git कमिट SHA जैसे हैश वैल्यूज़ से निपट रहे हों, जो लगभग हमेशा हेक्स होते हैं।
- एक वेब सर्वर पर परमिशन सेट कर रहे हों (
chmod)। - लो-लेवल डेटा फॉर्मेट, नेटवर्क प्रोटोकॉल, या बिटमास्क का उपयोग करने वाली किसी भी चीज़ (जैसे, फीचर फ्लैग) के साथ काम कर रहे हों।
- एक डीबगर में एरर कोड या मेमोरी एड्रेस का सामना कर रहे हों।
- यह समझने की कोशिश कर रहे हों कि कंप्यूटर वास्तव में कैसे काम करते हैं। यह एक foundational कॉन्सेप्ट है जो बहुत सारे डिजिटल जादू को सरल बनाता है।
और गहराई में जाएं
- Positional Notation (Wikipedia): सभी नंबर बेस सिस्टम के पीछे की थ्योरी में एक अकादमिक गहरा गोता।
- Hexadecimal (Wikipedia): बेस-16, इसके इतिहास, और कंप्यूटिंग में इसके सामान्य उपयोगों का एक शानदार अवलोकन।
- **MDN Web Docs:
<color>: CSS कलर वैल्यू के लिए वेब डेवलपर की निश्चित गाइड, जिसमें हेक्स (#RRGGBB) नोटेशन का विस्तृत स्पष्टीकरण शामिल है। chmodmanual page:chmodकमांड के लिए कैनोनिकल लिनक्स मैनुअल, जो फ़ाइल परमिशन सेट करने के लिए ऑक्टल के उपयोग का विवरण देता है।- Bitwise operations in JavaScript (MDN): एक प्रैक्टिकल गाइड जो दिखाती है कि एक हाई-लेवल भाषा में बिट-लेवल मैनिपुलेशन कैसे किए जाते हैं, जो बेस-2 ज्ञान को लागू करने का एक सामान्य परिदृश्य है।