एक लाइन में कहें तो
एक बेस कैलकुलेटर अलग-अलग गिनती करने के सिस्टम्स के बीच नंबरों का अनुवाद करता है, जैसे हमारा रोज़ का दशमलव (बेस-10) और वो बाइनरी (बेस-2) जिस पर सारी डिजिटल दुनिया चलती है।
यह क्या समस्या हल करता है
इंसान दस नंबर के दीवाने हैं। हमारे पास दस उंगलियां और दस पैर की उंगलियां हैं, इसलिए दस के ग्रुप में गिनती करना (दशमलव, या बेस-10, सिस्टम) सांस लेने जितना स्वाभाविक लगता है। लेकिन कंप्यूटर? वे थोड़े सरल हैं। अपने मूल में, वे केवल दो चीजें समझते हैं: "ऑन" और "ऑफ"। या तो करंट बह रहा है, या नहीं। एक ट्रांजिस्टर स्विच ऑन है, या नहीं। यह बाइनरी, या बेस-2 की दुनिया है। कंप्यूटर में जानकारी का हर एक टुकड़ा—यह टेक्स्ट, आपकी पसंदीदा बिल्ली का वीडियो, ऑपरेटिंग सिस्टम खुद—बस एक और शून्य की एक अविश्वसनीय रूप से लंबी लड़ी है।
इससे एक कल्चर क्लैश होता है। कंप्यूटिंग के शुरुआती दिनों में, प्रोग्रामर्स को अपने प्रोग्राम को डीबग करने के लिए बाइनरी कोड की इन विशाल दीवारों को घूरना पड़ता था। ज़रा सोचिए कि 10110010... जैसी दस लाख कैरेक्टर की स्ट्रिंग में एक टाइपो खोजने की कोशिश करना। यह पागलपन था, इसमें गलतियाँ होने की बहुत संभावना थी, और यह प्रोग्रामर के सिर दीवार पर मारने का एक प्रमुख कारण था।
अपने दिमागी संतुलन (और अपने माथे) को बचाने के लिए, उन्होंने शॉर्टहैंड विकसित किए। उन्होंने महसूस किया कि वे बिट्स को एक साथ ग्रुप कर सकते हैं। तीन-तीन के ग्रुप बनाने से उन्हें ऑक्टल (बेस-8) मिला, और चार-चार के ग्रुप बनाने से उन्हें हेक्साडेसिमल (बेस-16) मिला। अचानक, 1011001011111110 जैसी लंबी बाइनरी सीक्वेंस को कहीं ज़्यादा कॉम्पैक्ट हेक्स फॉर्म B2FE में लिखा जा सकता था।
बेस कैलकुलेटर इसी बुनियादी अनुवाद की समस्या को हल करने के लिए मौजूद है। यह इंसानी सोच की बेस-10 दुनिया और हमारे सिलिकॉन सेवकों की बेस-2, -8, और -16 दुनिया के बीच एक यूनिवर्सल डिप्लोमेट है।
अंदर की कहानी: यह कैसे काम करता है
नंबर बेस के बीच अदला-बदली के पीछे का जादू कोई जादू नहीं है—यह सिर्फ पोजीशनल नोटेशन नामक गिनती की एक प्रणाली है।
आखिर ये "बेस" है क्या?
किसी भी बेस में, एक अंक की स्थिति उसके मान को निर्धारित करती है। हम बेस-10 में इसे हल्के में लेते हैं। 345 संख्या में, हम सहज रूप से जानते हैं कि इसका मतलब है "तीन सौ, चार दहाई, और पाँच इकाई।"
गणितीय रूप से, यह है:
(3 * 10^2) + (4 * 10^1) + (5 * 10^0)
= (3 * 100) + (4 * 10) + (5 * 1)
= 300 + 40 + 5 = 345
"बेस" वह संख्या है जिसे आप प्रत्येक स्थिति के लिए एक घात तक बढ़ाते हैं (इस मामले में, 10)। यही नियम किसी भी बेस पर लागू होता है।
बाइनरी (बेस-2) में, हमारे पास केवल दो अंक होते हैं: 0 और 1। बाइनरी में 1011 संख्या है:
(1 * 2^3) + (0 * 2^2) + (1 * 2^1) + (1 * 2^0)
= (1 * 8) + (0 * 4) + (1 * 2) + (1 * 1)
= 8 + 0 + 2 + 1 = 11 (दशमलव में)
हेक्साडेसिमल (बेस-16) थोड़ा अजीब है क्योंकि हमें 16 यूनिक "अंकों" की आवश्यकता होती है। हम पहले दस के लिए 0-9 का उपयोग करते हैं, और फिर 10-15 के मानों के लिए A-F अक्षरों को उधार लेते हैं।
| दशमलव | हेक्स | बाइनरी |
|---|---|---|
| 0 | 0 | 0000 |
| 1 | 1 | 0001 |
| ... | ... | ... |
| 9 | 9 | 1001 |
| 10 | A | 1010 |
| 11 | B | 1011 |
| 12 | C | 1100 |
| 13 | D | 1101 |
| 14 | E | 1110 |
| 15 | F | 1111 |
दशमलव से किसी भी बेस में बदलना
दूसरी दिशा में जाने के लिए—हमारे परिचित दशमलव से दूसरे बेस में—हम बार-बार भाग देने का उपयोग करते हैं। चलिए 187 (दशमलव) को हेक्साडेसिमल (बेस-16) में बदलते हैं।
- 187 को 16 से भाग दें:
187 / 16 = 11शेष11के साथ। हेक्स में, 11Bहोता है। - परिणाम (11) को 16 से भाग दें:
11 / 16 = 0शेष11के साथ। हेक्स में, 11Bहोता है। - शेष को नीचे से ऊपर की ओर पढ़ें:
BB।
तो, दशमलव में 187 हेक्साडेसिमल में BB है।
विशेष संबंध: बाइनरी, ऑक्टल, और हेक्स
यहाँ वह खूबसूरत शॉर्टकट है जिसे शुरुआती प्रोग्रामर्स ने खोजा था। चूँकि 8 = 2^3 और 16 = 2^4, आप बाइनरी से ऑक्टल या हेक्स में बिना दशमलव को छुए ही बदल सकते हैं। आपको बस बिट्स को ग्रुप करना है!
बाइनरी संख्या 110101110100 को लें।
हेक्स (बेस-16) में बदलने के लिए: बिट्स को दाईं ओर से शुरू करते हुए चार-चार के ग्रुप में बाँटें।
1101 0111 0100फिर, प्रत्येक ग्रुप को बदलें:1101=D(13)0111=70100=4परिणाम: हेक्स मेंD74।ऑक्टल (बेस-8) में बदलने के लिए: बिट्स को दाईं ओर से शुरू करते हुए तीन-तीन के ग्रुप में बाँटें।
110 101 110 100फिर, प्रत्येक ग्रुप को बदलें:110=6101=5110=6100=4परिणाम: ऑक्टल में6564।
इसीलिए हेक्स और ऑक्टल इतने लोकप्रिय हैं। वे रॉ बाइनरी डेटा के कॉम्पैक्ट, मानव-पठनीय प्रतिनिधित्व हैं।
बिटवाइज़ ऑपरेशंस
एक प्रोग्रामर का कैलकुलेटर केवल बेस बदलने से कहीं आगे जाता है। यह बिटवाइज़ ऑपरेशन भी करता है, जो किसी संख्या के बाइनरी प्रतिनिधित्व के अलग-अलग एक और शून्य में हेरफेर करते हैं।
- AND (
&): प्रत्येक बिट स्थिति में 1 लौटाता है जिसके लिए दोनों ऑपरेंड के संबंधित बिट 1 होते हैं। यह "मास्किंग" या यह जांचने के लिए बहुत अच्छा है कि कोई विशेष बिट ऑन है या नहीं।1101 & 1011 = 1001 - OR (
|): प्रत्येक बिट स्थिति में 1 लौटाता है जिसके लिए किसी एक या दोनों ऑपरेंड के संबंधित बिट 1 होते हैं। किसी बिट को "सेट" करने यानी ऑन करने के लिए उपयोगी है।1101 | 1011 = 1111 - XOR (
^): प्रत्येक बिट स्थिति में 1 लौटाता है जिसके लिए संबंधित बिट अलग-अलग होते हैं। यह बिट्स को टॉगल करने का एक आसान तरीका है।1101 ^ 1011 = 0110 - NOT (
~): सभी बिट्स को पलट देता है।~1101 = 0010(4-बिट संख्याएँ मानते हुए) - बिट शिफ्ट्स (
<<,>>): सभी बिट्स को बाईं या दाईं ओर धकेल देता है। एक लेफ्ट शिफ्ट (<< 1) 2 से गुणा करने का एक तेज़ तरीका है; एक राइट शिफ्ट (>> 1) 2 से भाग करने का एक तेज़ तरीका है।
असल दुनिया की कहानियाँ
रहस्यमयी फ़ाइल टाइप का मामला
एक डेवलपर को data.bin नाम के अटैचमेंट के साथ एक ईमेल मिलता है। यह एक इमेज होनी चाहिए, लेकिन उसके कंप्यूटर को पता नहीं है कि इसे कैसे खोलें। हार मानने के बजाय, वह फ़ाइल को एक हेक्स व्यूअर में खोलती है। सबसे पहले बाइट्स 89 50 4E 47 0D 0A 1A 0A पढ़ते हैं। उसने इस तरह की निरर्थक चीज़ पहले भी देखी है। वह पहले चार बाइट्स, 89504E47, को एक सर्च इंजन में डालती है। परिणाम तुरंत आते हैं: यह एक PNG इमेज के लिए "मैजिक नंबर" या फ़ाइल सिग्नेचर है। वह फ़ाइल का नाम बदलकर data.png कर देती है, और voilà, यह एक टोपी पहने हुए शीबा इनु की शानदार तस्वीर दिखाने के लिए खुल जाता है।
सबक: हेक्साडेसिमल रॉ डेटा की भाषा है। इसे समझना आपको फाइलों को उनके सबसे बुनियादी स्तर पर पहचानने और डीबग करने की सुविधा देता है।
CSS कलर की उलझन
एक फ्रंट-एंड डेवलपर अपने बाल नोच रही है। उसने अपने CSS में एक सुंदर, चमकीला लाल रंग निर्दिष्ट किया है: color: #FF0000;। लेकिन स्क्रीन पर, रंग थोड़ा हल्का, ऑफ-रेड है। वह एलिमेंट का निरीक्षण करने के लिए ब्राउज़र के डेवलपर टूल का उपयोग करती है और पाती है कि कंप्यूटेड रंग वास्तव में #FE0000 है। एक बेस कैलकुलेटर का उपयोग करके, वह पुष्टि करती है कि FF दशमलव में 255 है (एक रंग चैनल के लिए अधिकतम मान), जबकि FE 254 है। अंतर छोटा है, लेकिन यह है। वह अपने जावास्क्रिप्ट कोड में कलर वैल्यू को ट्रैक करती है और एक ऐसा फंक्शन पाती है जो Math.round() के बजाय Math.floor() का उपयोग करके फ्लोटिंग-पॉइंट नंबर को इंटीजर में बदल रहा था। 254.99 जैसा मान 255 (FF) के बजाय 254 (FE) बन रहा था। एक त्वरित सुधार के बाद, उसका लाल रंग पूरी तरह से जीवंत हो जाता है।
सबक: हेक्स वेब कलर की lingua franca (आम भाषा) है। हेक्स वैल्यू के बारे में जल्दी से बदलने और तर्क करने में सक्षम होना पिक्सेल-परफेक्ट डिज़ाइन और डीबगिंग के लिए महत्वपूर्ण है।
एक लिनक्स सर्वर पर परमिशन सेट करना
एक जूनियर sysadmin को सर्वर पर एक कॉन्फ़िगरेशन फ़ाइल को सुरक्षित करने की आवश्यकता है। सीनियर एडमिन उसे बताता है, "परमिशन को rwx r-x --- पर सेट करें।" जूनियर एडमिन जानता है कि यह मालिक, समूह और अन्य परमिशन से मेल खाता है, लेकिन वह कमांड भूल गया है। उसे याद है कि लिनक्स परमिशन को ऑक्टल में दर्शाया जा सकता है। वह इसे तोड़ता है:
- मालिक:
rwx(पढ़ना, लिखना, निष्पादित करना) =4 + 2 + 1 = 7 - समूह:
r-x(पढ़ना, निष्पादित करना) =4 + 0 + 1 = 5 - अन्य:
---(कोई परमिशन नहीं) =0 + 0 + 0 = 0
वह उन्हें मिलाकर ऑक्टल संख्या 750 प्राप्त करता है। वह आत्मविश्वास से chmod 750 config.yml टाइप करता है और अपने सीनियर से शाबाशी पाता है।
सबक: ऑक्टल बिटमास्क का प्रतिनिधित्व करने का एक संक्षिप्त और मानक तरीका प्रदान करता है, जो यूनिक्स फ़ाइल परमिशन जैसे लो-लेवल सिस्टम में आम हैं।
आम गलतियाँ और pièges
- प्रीफिक्स लगाना भूल जाना:
10संख्या का दशमलव, बाइनरी और हेक्साडेसिमल में बहुत अलग मतलब होता है। कोड और डॉक्यूमेंटेशन अस्पष्टता से बचने के लिए हेक्स के लिए0x(0x10= 16), बाइनरी के लिए0b(0b10= 2), और ऑक्टल के लिए0o(0o10= 8) जैसे प्रीफिक्स का उपयोग करते हैं। हमेशा संदर्भ का ध्यान रखें। - एक जैसे दिखने वाले कैरेक्टर्स में कन्फ्यूज होना: जब आप थके हुए हों और मेमोरी डंप को घूर रहे हों, तो
Bऔर8, याDऔर0में घालमेल करना आसान है। अपने हेक्साडेसिमल ट्रांसक्रिप्शन को दोबारा जांचें। - Signedness को नज़रअंदाज़ करना (टू'स कॉम्प्लिमेंट): हेक्स में
0xFFFFके रूप में दर्शाई गई 16-बिट संख्या का मतलब65535हो सकता है यदि यह एक unsigned इंटीजर है। लेकिन अगर यह एक signed इंटीजर है जो आम "टू'स कॉम्प्लिमेंट" सिस्टम का उपयोग कर रहा है, तो यह-1का प्रतिनिधित्व करता है। बिट्स का अर्थ पूरी तरह से इस बात पर निर्भर करता है कि उनकी व्याख्या कैसे की जाती है। - Endianness की मुसीबतें: जब
0x1A2B3C4Dजैसी मल्टी-बाइट संख्या मेमोरी में संग्रहीत होती है, तो बाइट का क्रम भिन्न हो सकता है। "बिग-एंडियन" सिस्टम इसे1A 2B 3C 4Dके रूप में संग्रहीत करते हैं। "लिटिल-एंडियन" सिस्टम (जैसे अधिकांश आधुनिक पीसी) इसे4D 3C 2B 1Aके रूप में संग्रहीत करते हैं। यह नेटवर्किंग और फ़ाइल पार्सिंग में बग का एक क्लासिक स्रोत है जब अलग-अलग एंडियननेस वाले दो सिस्टम संवाद करने का प्रयास करते हैं।
यह आपके रडार पर क्यों होना चाहिए
जब भी आप हाई-लेवल एब्स्ट्रैक्शन की सतह के नीचे झाँक रहे हों, आपको अलग-अलग नंबर बेस में सोचना चाहिए। इसमें शामिल है:
- नेटवर्क पैकेट का विश्लेषण करना (जैसे, MAC एड्रेस, IPv6 एड्रेस)।
- फ़ाइल प्रारूपों या रॉ मेमोरी डंप के साथ काम करना।
- हैश आउटपुट (जैसे, SHA-256) से निपटना जो लगभग हमेशा हेक्स में दिखाए जाते हैं।
- वेब रंगों या बिटमैप ग्राफिक्स को फाइन-ट्यून करना।
- बिटवाइज़ ऑपरेशंस का उपयोग करके प्रदर्शन-महत्वपूर्ण कोड लिखना।
- लो-लेवल सिस्टम सेटिंग्स को कॉन्फ़िगर करना, जैसे परमिशन या हार्डवेयर रजिस्टर।
बेस को समझना एक डेवलपर सुपरपावर है। यह आपके द्वारा लिखे गए कोड और उसे जीवन देने वाले इलेक्ट्रॉनिक पल्स के बीच की खाई को पाटता है।
और गहराई में जाएं
- विकिपीडिया पर Positional notation — सभी नंबर बेस सिस्टम की गणितीय नींव।
- विकिपीडिया पर Hexadecimal — बेस-16, इसके इतिहास और इसके सामान्य उपयोगों में एक गहरा गोता।
- विकिपीडिया पर Two's Complement — इस बात की निश्चित व्याख्या कि कंप्यूटर बाइनरी में ऋणात्मक संख्याओं का प्रतिनिधित्व कैसे करते हैं।
- MDN पर JavaScript Bitwise Operators — एक लोकप्रिय भाषा में बिटवाइज़ ऑपरेशंस का उपयोग करने के लिए एक व्यावहारिक गाइड।
- विकिपीडिया पर List of file signatures — फाइलों को उनके "मैजिक नंबर" से पहचानने के लिए एक आसान संदर्भ, जो अक्सर हेक्स में व्यक्त किया जाता है।
- विकिपीडिया पर Endianness — जानें कि बाइट्स का क्रम आपके विचार से कहीं अधिक महत्वपूर्ण क्यों है।