বিসি-র সাথে রূপান্তরকরণের ক্ষেত্রে "আইবেস" এবং "অববেস" বোঝেন?


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

    এটি ইনপুট বেসটি 15 এবং আউটপুট বেস 10 তে সেট করে, যেহেতু একক-অঙ্কের মান হেক্সে ব্যাখ্যা করা হয়, পসিক্স অনুসারে । এটি bcআপনাকে C0₁₅ A₁₅ = 10 বেসে কী বলে তা জিজ্ঞাসা করবে এবং এটি 180₁₀-এর সঠিক উত্তর দিচ্ছে, যদিও এটি অবশ্যই আপনি জিজ্ঞাসা করতে চেয়েছিলেন এমন প্রশ্ন নয়।

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

    C0

    এটি বেস 15 এ নাল রূপান্তর।

    কেন? প্রথমটি, কারণ একক Fঅঙ্কটি হেক্সে ব্যাখ্যা করা হয়েছে, যেমন আমি পূর্ববর্তী উদাহরণে উল্লেখ করেছি। তবে এখন আপনি এটি বেস 15 এ সেট করেছেন, নীচের আউটপুট বেস সেটিংটি সেইভাবে ব্যাখ্যা করা হয়েছে এবং 10 15 = 15, সুতরাং আপনার C0₁₅ থেকে C0₁₅ এ নাল রূপান্তর রয়েছে ₁₅

    এটা ঠিক, আপনি অনুমান করার সাথে সাথে আউটপুট হেক্সে নেই, এটি 15 বেসে!

    F0পরিবর্তে রূপান্তর করার চেষ্টা করে আপনি নিজের কাছে এটি প্রমাণ করতে পারেন C0। যেহেতু Fবেস 15 এ কোনও সংখ্যা নেই , তাই bcএটি ক্ল্যাম্প করে এবং আউটপুট হিসাবে E0দেয় E0

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

    192

    এটি আপনার তিনটি উদাহরণের মধ্যে কেবলমাত্র একটিরই সম্ভবত ব্যবহারিক ব্যবহার রয়েছে।

    এটি প্রথমে ইনপুট বেসটিকে হেক্সে পরিবর্তন করছে , যাতে আপনাকে আর Aএই ক্ষেত্রে কেন হেক্স, 10 হিসাবে ব্যাখ্যা করা হয় তা বুঝতে পসিক্স স্পেকটি খনন করতে হবে না । এটির সাথে একমাত্র সমস্যা হ'ল আউটপুট বেসটি A₁₆ = 10 এ সেট করা অপ্রয়োজনীয়, যেহেতু এটির ডিফল্ট মান।


7

সেটিং এর ibaseঅর্থ আপনাকে obaseএকই বেসে সেট করা দরকার । আপনার উদাহরণগুলি ব্যাখ্যা করে এটি প্রদর্শিত হবে:

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

আপনি bc"আইবেজ = এফ" এর সাহায্যে বেস 15 এ উপস্থাপিত হিসাবে ইনপুট সংখ্যাগুলি বিবেচনা করার জন্য সেট করেছেন। "অববেস = এ" আউটপুট নম্বরগুলি বেস 10 এ সেট করে, এটি ডিফল্ট।

bc সি 15 কে বেস 15 নম্বর হিসাবে পাঠায়: সি = 12. 12 * 15 = 180।


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

এই একটিতে, আপনি বেস 15 এ ইনপুট এবং 10 এ আউটপুট সেট করেন - বেস 15 এ, তাই আউটপুট বেস 15 হয় base


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

বেস 16 এ ইনপুট সেট করুন, বেস 10 তে আউটপুট (বেস 16 এ এ 10 হবে)।

C0 বেস 10 এ রূপান্তরিত হয়েছে: 12 * 16 = 192


আমার ব্যক্তিগত নিয়মটি হ'ল প্রথমে অবেস সেট করা, যাতে আমি বেস 10 ব্যবহার করতে পারি। তারপরে আইবেস সেট করুন, বেস 10 ব্যবহার করুন।

দ্রষ্টব্য যে bcএকটি হাস্যকর ব্যতিক্রম আছে: ibase=Aএবং obase=Aসর্বদা ইনপুট এবং আউটপুট 10 বেসে সেট করে the bcম্যান পৃষ্ঠা থেকে:

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

এই আচরণ এর স্পেসিফিকেশন enshrined হয় bcথেকে: 2004 OpenGroup 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 ব্যবহার করে বেসটি সেট করার পরামর্শ দিয়েছি yourself নিজেকে বিভ্রান্ত করবেন না।


@ স্টাফেনচেজেলাস - আমার 1989 বা তার মধ্যে সিসভিআর 3 মেশিনে "আইবেজ = এ" কাজ করার একটি স্মৃতি আছে। আমি বাজি ধরছি এটি একক ইউনিক্স স্পেকের থেকে আরও পিছিয়ে যায়। আমি দ্রুত কোনও রেফ গুগল করতে পারিনি।
ব্রুস এডিগার

আমি মনে করি কারণ এটি পুরানো চশমাগুলির সাথে আরও দীর্ঘসূত্র রয়েছে যেহেতু তারা দীর্ঘকাল ধরে রয়েছে। অ্যাপাচি / মাইএসকিএল / বাগজিলা ... ডকুমেন্টেশনের ক্ষেত্রে একই ধরণের জিনিস ঘটে ... যেখানে গুগল আপনাকে সর্বশেষতমের পরিবর্তে পুরানো সংস্করণগুলির জন্য ডক দেয়।
স্টাফেন চেজেলাস

5

সমস্ত সংখ্যা জিএনইউ বিসি দ্বারা বর্তমান ইনপুট বেস হিসাবে ব্যাখ্যা করা হয় যা নম্বরটি উপস্থিত হয় সেই বক্তব্যটির জন্য কার্যকর হয় you আপনি যখন বর্তমান ইনপুটটির বাইরে কোনও অঙ্ক ব্যবহার করেন তখন তাদের বেসে উপলব্ধ সর্বোচ্চ সংখ্যার (দশমিক 9) হিসাবে ব্যাখ্যা করুন একক সংখ্যার সংখ্যার, বা একক অঙ্কের সংখ্যা হিসাবে ব্যবহৃত হলে তাদের সাধারণ মান হিসাবে ( A= দশমিক দশমিক 10)

থেকে ম্যানুয়াল বিসি গনুহ :

একক অঙ্কের সংখ্যার সর্বদা আইবেসের মান নির্বিশেষে অঙ্কের মান থাকে । (অর্থাত্ A = 10.) বহু-সংখ্যার সংখ্যার জন্য, bcসমস্ত ইনপুট অঙ্কগুলি ইবাজে -1 এর মানতে ইবেসে বৃহত্তর বা সমান পরিবর্তন করে । এটি নম্বরটি সর্বদা ইনপুট বেসের বৃহত্তম 3 সংখ্যার সংখ্যা করে তোলে ।FFF

যাইহোক, আপনার সচেতন হওয়া উচিত যে পসিক্স স্ট্যান্ডার্ড কেবল এই আচরণটি নির্ধারিত ক্ষেত্রে ibaseএবং obaseঅন্য কোনও প্রসঙ্গে নয়, এই কার্যভারের জন্য সংজ্ঞা দেয় ।

বিসিতে এসইএস স্পেসিফিকেশন থেকে :

যখন আইবিজে বা ওবাজকে বিসি-তে লেক্সিকাল কনভেনশনগুলির তালিকা থেকে একক অঙ্কের মান নির্ধারণ করা হয়, তখন মানটি হেক্সাডেসিমাল হিসাবে ধরে নেওয়া হবে। (উদাহরণস্বরূপ, ibase বেস থেকে দশ একজন সেট =, বর্তমান নির্বিশেষে ibase মান।) তা না হলে, আচরণ যখন এর চেয়ে বড় বা ডিজিট মান সমান undefined হয় ibase ইনপুট প্রদর্শিত হয়। আইবেজ এবং ওবাজ উভয়ের প্রাথমিক মান 10 হবে।

আপনি যে মূল বিষয়টি হারিয়েছেন তা হ'ল এফ আসলে ষোলটি নয়, তবে বাস্তবে পনেরটি, সুতরাং আপনি যখন আইবেস = এফ সেট করছেন আপনি ইনপুট বেসটি পনেরোতে সেট করছেন।

অতএব, portably একটি অজানা রাজ্য থেকে হেক্সাডেসিমেলে ibase সেট করতে, তাই দুই বিবৃতি ব্যবহার করতে হবে: ibase=A; ibase=16। তবে প্রোগ্রামটির শুরুতে আপনি এটি দশমিক এবং সহজভাবে ব্যবহারের উপর নির্ভর করতে পারেন ibase=16


+1: সাথে সুন্দর কৌশল ibase=A; ibase=16
ওয়ারেন ইয়ং

এটি SUSv3, SUSv6 নয়। এসইউএসভি 4 পাবস.ওপেনগ্রুপ. org
স্টাফেন

আমি সর্বদা ভাবতাম শিরোনামের 6 এবং 7 সংস্করণ। আমি কখনও আলাদা কিছু দেখিনি - # 1-5 ইস্যু কি?
র্যান্ডম 832

@ র্যান্ডম 832: সুস এবং পসিক্স একই জিনিস নয়
ওয়ারেন ইয়ং

@ ওয়ারেন ইয়ং কি পসিক্স যুক্ত করে না? এই অনুচ্ছেদে কোনও এক্সটেনশন ট্যাগ নেই এবং ডকুমেন্টটিতে "POSIX.1-2-2008 এর এই ভলিউমের অংশ" এর মতো জিনিস রয়েছে।
র্যান্ডম 832

0

ম্যান পেজ অনুযায়ী যেহেতু কোনও সংখ্যার পরিবর্তে একক-সংখ্যা নম্বর সেট ibaseএবং obaseব্যবহার করার পরামর্শ সর্বদা দেওয়া হয় ,16bc

একক অঙ্কের সংখ্যার সর্বদা আইবেসের মান নির্বিশেষে অঙ্কের মান থাকে।

এর অর্থ হ'ল 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। একইভাবে, আপনি যদি বেস নম্বরগুলিতে আপনার সংখ্যাগুলি ইনপুট করতে চলেছেন এবং সেগুলি বেস 16 এ আউটপুট করেন তবে ব্যবহার করুন

ibase=E; obase=F+1

যদিও স্নানের ফর্মগুলির একই ফলাফল রয়েছে তবে পূর্বেরটি ত্রুটির প্রবণতা কম, অন্যদিকে আরও বিভ্রান্তি ও ত্রুটি হতে পারে।

দুটি রূপের মধ্যে পার্থক্য বিশেষত আরও প্রকট হয়ে ওঠে, যখন আপনি মৃত্যুদন্ড কার্যকর করার পরিবেশে থাকেন bc, বা আপনি কোনও ফাইলে আপনার গণনা লিখতে যাচ্ছেন এবং তারপরে সেই ফাইলটিকে bcএকটি যুক্তি হিসাবে পাস করুন । এই পরিস্থিতিতে আপনাকে ibaseএবং obaseকয়েকবারের মান পরিবর্তন করতে হতে পারে এবং পরবর্তী রূপটি ব্যবহার করে মারাত্মক বিভ্রান্তি ও ত্রুটি হতে পারে। (এটি অভিজ্ঞতা)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.