Bc के साथ रूपांतरण के मामले में "ibase" और "obase" को समझें?


22

मैं अक्सर bcदशमलव और इसके विपरीत हेक्स को परिवर्तित करने के लिए उपयोगिता का उपयोग करता हूं । हालांकि, यह हमेशा थोड़ा परीक्षण और त्रुटि है कि कैसे ibaseऔर obaseकॉन्फ़िगर किया जाना चाहिए। उदाहरण के लिए यहाँ मैं हेक्स मान C0 को दशमलव में बदलना चाहता हूँ:

$ echo "ibase=F;obase=A;C0" | bc
180
$ echo "ibase=F;obase=10;C0" | bc
C0
$ echo "ibase=16;obase=A;C0" | bc
192

यहाँ क्या तर्क है? obase( Aमेरे तीसरे उदाहरण में) उसी आधार में होने की आवश्यकता है जो कि मूल्य ( C0मेरे उदाहरणों में परिवर्तित ) में है और ibase( 16मेरे तीसरे उदाहरण में) उस आधार में होना चाहिए जहां मैं परिवर्तित कर रहा हूं?


1
हेक्स गणना के लिए (हेक्स में इनपुट और आउटपुट) मुझे आईबेस से पहले ओबेस सेट करना है!
पास्चलीस

जवाबों:


36

आप वास्तव में क्या कहना चाहते हैं:

$ echo "ibase=16; C0" | bc
192

हेक्स-दशमलव के लिए, और:

$ echo "obase=16; 192" | bc
C0

दशमलव-से-हेक्स के लिए।

आप दोनों को देने के लिए की जरूरत नहीं है ibaseऔर obase, के बाद से 10 में इन सेटिंग को डिफ़ॉल्ट दशमलव संख्या को शामिल किसी भी रूपांतरण के लिए।

आप करते हैं , जैसे द्विआधारी करने वाली हेक्स के रूप में रूपांतरण के लिए दोनों को देने के लिए की जरूरत है। उस स्थिति में, अगर आप obaseपहली बार देते हैं तो मुझे चीजों को समझने में आसानी होती है :

$ echo "obase=16; ibase=2; 11000000" | bc
C0

यदि आप ibaseइसके बजाय पहले देते हैं, तो यह निम्नलिखित obaseसेटिंग की व्याख्या को बदल देता है , ताकि कमांड होना चाहिए:

$ echo "ibase=2; obase=10000; 11000000" | bc
C0

ऐसा इसलिए है क्योंकि इस क्रम में, obaseमान को द्विआधारी संख्या के रूप में समझा जाता है, इसलिए आपको हेक्स में आउटपुट प्राप्त करने के लिए 10000₂ = 16 देने की आवश्यकता है। वह अनाड़ी है।


अब आप काम करते हैं कि आपके तीन उदाहरण क्यों व्यवहार करते हैं।

  1. echo "ibase=F;obase=A;C0" | bc

    180

    POSIX के अनुसार , इनपुट बेस को 15 और आउटपुट बेस को 10 पर सेट किया गया है, क्योंकि हेक्स में एकल-अंकों के मूल्य की व्याख्या की गई है । यह bcआपको यह बताने के लिए कहता है कि आधार A 10 = 10 में C0₁₅ क्या है, और यह 180₁₀ का सही उत्तर दे रहा है, हालांकि यह निश्चित रूप से वह प्रश्न नहीं है जिसका आप पूछना चाहते हैं।

  2. echo "ibase=F;obase=10;C0" | bc

    C0

    यह आधार 15 में एक शून्य रूपांतरण है।

    क्यूं कर? पहला, क्योंकि एकल Fअंक की व्याख्या हेक्स में की गई है, जैसा कि मैंने पिछले उदाहरण में बताया है। लेकिन अब जब आपने इसे आधार 15 पर सेट कर दिया है, तो निम्न आउटपुट बेस सेटिंग की व्याख्या इस तरह से की जाती है, और 10₁₅ = 15, इसलिए आपके पास C0₁₅ से ​​C0₁₅ तक एक अशक्त रूपांतरण है।

    यह सही है, आउटपुट हेक्स में नहीं है जैसा कि आप मान रहे थे, यह आधार 15 में है!

    आप इसे बदलने की कोशिश करके खुद को साबित कर सकते F0हैं C0। चूंकि Fआधार 15 में कोई अंक नहीं है , bcइसलिए इसे आउटपुट के रूप में क्लैम्प E0और देता है E0

  3. echo "ibase=16; obase=A; C0"

    192

    यह आपके तीन उदाहरणों में से केवल एक ही है जिसका किसी भी व्यावहारिक उपयोग की संभावना है।

    यह पहले इनपुट बेस को हेक्स में बदल रहा है , ताकि आपको Aइस मामले में हेक्स के रूप में क्यों समझा जाए, यह समझने के लिए आपको पोसिक्स में खुदाई करने की आवश्यकता नहीं है । इसके साथ एकमात्र समस्या यह है कि आउटपुट बेस को A 10 = 10 पर सेट करना निरर्थक है, क्योंकि यह इसका डिफ़ॉल्ट मान है।


7

सेटिंग का ibaseमतलब obaseहै कि आपको उसी बेस में सेट करना होगा । आपके उदाहरणों को समझाते हुए यह दिखाया जाएगा:

echo "ibase=F;obase=A;C0" | bc

आप bcबेस संख्या 15 में "ibase = F" के साथ दर्शाए गए इनपुट संख्या पर विचार करने के लिए सेट हैं । "obase = A" आउटपुट संख्या को आधार 10 पर सेट करता है, जो कि डिफ़ॉल्ट है।

bc C0 को आधार संख्या 15 के रूप में पढ़ता है: C = 12. 12 * 15 = 180।


echo "ibase=F;obase=10;C0" | bc

इस एक में, आप बेस 15 में इनपुट सेट करते हैं, और आउटपुट 15 से बेस 15 में, इसलिए आउटपुट बेस 15. 15 है। बेस 15 में C0 इनपुट बेस 15 में C0 आउटपुट है।


echo "ibase=16;obase=A;C0" | bc

बेस 16 पर इनपुट सेट करें, बेस 10 पर आउटपुट (बेस 16 में ए 10 बेस 10 में है)।

C0 को आधार 10 में परिवर्तित किया गया है: 12 * 16 = 192


मेरा व्यक्तिगत नियम है कि पहले ओबेस को सेट किया जाए, ताकि मैं बेस 10 का उपयोग कर सकूं। फिर आईबेस को भी सेट करें, बेस 10 का भी उपयोग करें।

ध्यान दें कि bcएक विडंबना अपवाद है: ibase=Aऔर obase=Aहमेशा बेस 10 पर इनपुट और आउटपुट सेट करता है। bcमैन पेज से:

Single digit numbers always have the value of the digit 
regardless of the value of ibase.

इस व्यवहार को विनिर्देशन में निर्दिष्ट किया गया है bc: 2004 के ओपनग्रुप bcविनिर्देश से :

When either ibase or obase is assigned a single digit value from 
the list in 'Lexical Conventions in bc', the value shall be assumed
in hexadecimal. (For example, ibase=A sets to base ten, regardless 
of the current ibase value.) Otherwise, the behavior is undefined 
when digits greater than or equal to the value of ibase appear in
the input.

इसीलिए ibase=Fसेटिंग ने आपके इनपुट बेस को आधार 15 में बदल दिया, और मैंने हमेशा बेस 10 का उपयोग करके आधार सेट करने की सिफारिश की। अपने आप को भ्रमित करने से बचें।


@ स्टीफनचेज़लस - मेरे पास 1989 में SysVr3 मशीन पर काम करने वाले "ibase = A" का स्मरण है। मुझे यकीन है कि यह एकल Unix कल्पना है कि आगे वापस चला जाता है। मैं जल्दी से एक पहले रेफरी गूगल नहीं कर सका।
ब्रूस एडिगर

मुझे लगता है कि क्योंकि पुराने चश्मे के चारों ओर अधिक लिंक हैं क्योंकि वे लंबे समय से आसपास हैं। इसी तरह की बातें अपाचे / mysql / Bugzilla के लिए होती हैं ... प्रलेखन जहां Google आपको नवीनतम के बजाय पहले पुराने संस्करणों के लिए डॉक्टर देता है।
स्टीफन चेज़लस

5

सभी संख्याओं की व्याख्या जीएनयू बीसी द्वारा की जाती है जो वर्तमान इनपुट बेस के रूप में होता है जो उस नंबर के लिए प्रभावी होता है, जब आप वर्तमान इनपुट के बाहर एक अंक का उपयोग करते हैं तो उन्हें आधार में उपलब्ध उच्चतम अंकों (दशमलव में 9) के रूप में व्याख्या करते हैं। जब एक एकल अंक संख्या ( Aदशमलव में 10 =) के रूप में उपयोग किया जाता है, तो कई अंकों की संख्या या उनके सामान्य मूल्यों के रूप में।

से मैनुअल बीसी जीएनयू :

एकल अंकों वाली संख्याओं में हमेशा आइबस के मूल्य की परवाह किए बिना अंकों का मूल्य होता है । (यानी A = 10.) बहु-अंकीय संख्याओं के लिए, bcसभी इनपुट अंकों को ibase -1 के मान के लिए ibase से अधिक या बराबर बदलता है । यह नंबर को हमेशा इनपुट बेस का सबसे बड़ा 3 अंकों वाला नंबर बनाता है ।FFF

हालांकि, आप जानते हैं कि POSIX मानक केवल करने के लिए कार्य के लिए इस व्यवहार को परिभाषित करता है होना चाहिए ibaseऔर obase, और नहीं में किसी भी अन्य संदर्भ।

से बीसी पर SUS विनिर्देश :

जब या तो ibase या obase को बीसी में लेक्सिकल कन्वेंशन की सूची से एकल अंक मान सौंपा गया है , तो मान को हेक्साडेसिमल में माना जाएगा। (उदाहरण के लिए, ibase = वर्तमान ibase मान की परवाह किए बिना दस बेस पर सेट होता है ।) अन्यथा, इनपुट में ibase के मान के बराबर या उससे अधिक अंक होने पर व्यवहार अपरिभाषित होता है । आइबेस और ओबेस दोनों में 10 के प्रारंभिक मान होंगे।

जो महत्वपूर्ण कारक आपको याद आ रहा है वह यह है कि F वास्तव में सोलह नहीं है, लेकिन वास्तव में पंद्रह है, इसलिए जब आप ibase = F सेट कर रहे हैं तो आप इनपुट बेस को पंद्रह पर सेट कर रहे हैं।

इसलिए, एक अज्ञात स्थिति से इब्से को हेक्साडेसिमल में सेट करने के लिए, आपको इसलिए दो कथनों का उपयोग करने की आवश्यकता है ibase=A; ibase=16:। हालाँकि, प्रोग्राम की शुरुआत में आप इसे दशमलव होने पर भरोसा कर सकते हैं और बस उपयोग कर सकते हैं ibase=16


+1: साथ प्यारा चाल ibase=A; ibase=16
वॉरेन यंग

वह SUSv3 है, SUSv6 नहीं। SUSv4 पर है pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html
स्टीफन Chazelas

मैं हमेशा सोचा था कि हेडर में 6 और 7 संस्करण थे। मैंने कभी भी कुछ अलग नहीं देखा है - क्या # 1-5 मुद्दे हैं?
रैंडम 832


@ArrenYoung SOS में POSIX शामिल नहीं है? इस पैराग्राफ में कोई एक्सटेंशन टैग नहीं है, और दस्तावेज़ "POSIX.1-2008 के इस वॉल्यूम का हिस्सा" जैसी चीज़ों को कहता है।
रैंडम 832

0

यह हमेशा एक-अंकों की संख्या को सेट करने ibaseऔर obaseउपयोग करने की सिफारिश की जाती है , एक संख्या के बजाय जैसे कि 16, bcमैन पेज के अनुसार ,

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

इसका मतलब यह है कि मूल्य क्या है, इसकी परवाह किए बिना A,B,...,Fहमेशा 10,11,...,15क्रमशः मूल्य हैं ibase। आप F+1संख्या निर्दिष्ट करने के लिए भी उपयोग कर सकते हैं 16। उदाहरण के लिए, आप बेहतर लिखेंगे

echo "ibase=F+1; obase=A; C0" | bc

echo "ibase=16; obase=A; C0" | bcयह बताने के बजाय कि इनपुट बेस है 16और आउटपुट बेस है 10। या उदाहरण के लिए, यदि आप दोनों चाहते हैं ibaseऔर obase16 वर्ष के हैं, तो आप बेहतर उपयोग करेंगे

ibase=F+1; obase=F+1

उपयोग करने के बजाय ibase=16; obase=10। इसी तरह, यदि आप बेस 14 में अपने नंबरों को इनपुट करने जा रहे हैं और उन्हें बेस 16 में उपयोग करते हैं, तो उपयोग करें

ibase=E; obase=F+1

यद्यपि स्नान के रूपों में एक ही परिणाम होता है, पूर्व कम त्रुटि प्रवण होता है, जबकि उत्तरार्द्ध में अधिक भ्रम और त्रुटि हो सकती है।

दो रूपों के बीच का अंतर विशेष रूप से अधिक स्पष्ट हो जाता है, जब आप निष्पादन के माहौल में होते हैं bc, या आप किसी फ़ाइल में अपनी गणना लिखने जा रहे होते हैं, और फिर उस फ़ाइल को bcएक तर्क के रूप में पास करते हैं । ऐसी स्थितियों में, आपको ibaseऔर obaseकई बार मूल्यों को बदलना पड़ सकता है , और बाद के रूप का उपयोग करके, गंभीर भ्रम और त्रुटियां हो सकती हैं। (उस का अनुभव करें)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.