বাইনারি-ডেসিমেল কনভার্সন ও বেস কনভার্সন
এই পাঠে যা শিখবেন
- বাইনারি থেকে দশমিকে রূপান্তরের পজিশনাল-সমষ্টি পদ্ধতি
- দশমিক থেকে বাইনারিতে রূপান্তরের বার বার-ভাগ পদ্ধতি, এবং কেন ভাগশেষ উল্টো ক্রমে পড়তে হয়
- এই দুই পদ্ধতি কীভাবে একে অপরের সঠিক ইনভার্স, তা কোড দিয়ে প্রমাণ করা
- দশমিককে মধ্যবর্তী স্টেশন ব্যবহার করে যেকোনো দুটি বেসের মধ্যে সাধারণ রূপান্তর
১ · বাইনারি থেকে দশমিক — পজিশনাল সমষ্টি
L02-এ শেখা পজিশনাল সূত্র সরাসরি প্রয়োগ করেই বাইনারি থেকে দশমিকে রূপান্তর করা যায় — প্রতিটি বিটকে তার অবস্থানের প্লেস ভ্যালু (2position, ডান দিক থেকে position 0 গুনে) দিয়ে গুণ করে সবগুলো যোগ করুন। উদাহরণ হিসেবে বাইনারি 1011 নিন (যাচাই করে দেখুন):
$$1011_2 = 1{\times}2^3 + 0{\times}2^2 + 1{\times}2^1 + 1{\times}2^0 = 8+0+2+1 = 11_{10}$$
এই পদ্ধতিটি সবসময় ডান থেকে বামে বিটের অবস্থান গোনা শুরু করে (রাইটমোস্ট বিট = position 0), কারণ সেটাই সবচেয়ে ছোট প্লেস ভ্যালু — ঠিক দশমিকে "একক, দশক, শতক" গোনার মতোই, শুধু বেস 2।
২ · দশমিক থেকে বাইনারি — বার বার ভাগ পদ্ধতি
উল্টো দিকের রূপান্তরের সবচেয়ে সাধারণ পদ্ধতি হলো বার বার ২ দিয়ে ভাগ করে remainderRemainder (ভাগশেষ)একটি ভাগ অপারেশনের পর যা অবশিষ্ট থাকে — বার বার ২ দিয়ে ভাগ করার সময় প্রতিটি ভাগশেষই একটি করে বাইনারি বিট নির্ধারণ করে। সংগ্রহ করা — সংখ্যাটিকে ২ দিয়ে ভাগ করুন, ভাগশেষ টুকে রাখুন, ভাগফল নিয়ে আবার ভাগ করুন, যতক্ষণ না ভাগফল শূন্য হয়। সবশেষে সংগৃহীত ভাগশেষগুলো উল্টো ক্রমে (শেষেরটি প্রথমে) পড়লেই বাইনারি সংখ্যা পাওয়া যায়। উদাহরণ হিসেবে দশমিক 11 নিন (উপরের ফলাফলের সাথে মিলিয়ে দেখুন):
11÷2 = 5 ভাগশেষ 1 → 5÷2 = 2 ভাগশেষ 1 → 2÷2 = 1 ভাগশেষ 0 → 1÷2 = 0 ভাগশেষ 1
ভাগশেষগুলো সংগ্রহ হলো ক্রমে: 1, 1, 0, 1 — এখন এগুলো উল্টো ক্রমে পড়ুন (নিচ থেকে উপরে): 1, 0, 1, 1 → বাইনারি "1011" — ঠিক উপরের ধাপের সাথে মিলে যাচ্ছে। ভাগশেষ উল্টো ক্রমে পড়তে হয় কারণ প্রথম ভাগশেষটাই সবচেয়ে ছোট প্লেস ভ্যালুর (position 0) বিট নির্ধারণ করে — অর্থাৎ সেটাই রাইটমোস্ট বিট, লেফটমোস্ট নয়।
একটি বিকল্প পদ্ধতিও আছে — সংখ্যা থেকে যতটা সম্ভব বড় 2-এর ঘাত বিয়োগ করে যান, প্রতিবার সফল বিয়োগে সংশ্লিষ্ট বিট 1 বসান। যেমন 11: 11−8=3 (bit 3 = 1), 3−2=1 (bit 1 = 1), 1−1=0 (bit 0 = 1) — বাকি বিট 0 — ফলাফল আবারও "1011", একই উত্তর, ভিন্ন পথে। দুটো পদ্ধতিই সবসময় একমত হবে, কারণ উভয়ই একই পজিশনাল সিস্টেমের সমতুল্য বর্ণনা।
৩ · সাধারণ বেস কনভার্সন — দশমিককে মধ্যবর্তী স্টেশন ধরা
এই দুই পদ্ধতিকে একসাথে জুড়লে যেকোনো বেস থেকে যেকোনো বেসে রূপান্তরের একটি সাধারণ (general) পদ্ধতি পাওয়া যায় — প্রথমে উৎস বেস থেকে দশমিকে যান (পজিশনাল সমষ্টি, ধাপ ১-এর মতো), তারপর দশমিক থেকে লক্ষ্য বেসে যান (বার বার ভাগ, ধাপ ২-এর মতো, শুধু ২-এর বদলে লক্ষ্য বেস দিয়ে ভাগ করুন)। এই দুই-ধাপ পদ্ধতি যেকোনো জোড়া বেসের জন্য কাজ করে — এমনকি যাদের মধ্যে L02-এর নিবল-গ্রুপিং ট্রিকের মতো কোনো সরাসরি "শর্টকাট" সম্পর্ক নেই (সেই ট্রিক শুধু 2-এর ঘাত-সম্পর্কিত বেসগুলোর জন্যই কাজ করত)।
# বাইনারি <-> দশমিক রূপান্তর -- হাতে-কলমে অ্যালগরিদম হিসেবে বাস্তবায়ন (Python-এর int(x,2)/bin() ব্যবহার না করে)
def binary_to_decimal(bits):
"""বাইনারি বিট-লিস্ট (MSB প্রথমে) -> দশমিক -- পজিশনাল সমষ্টি নিজে হিসাব করে"""
n = len(bits)
total = 0
for i, bit in enumerate(bits):
power = n - 1 - i
total += bit * (2 ** power)
return total
def decimal_to_binary(n):
"""দশমিক -> বাইনারি বিট-লিস্ট -- বার বার ২ দিয়ে ভাগ করে ভাগশেষ সংগ্রহ, উল্টো ক্রমে সাজানো"""
if n == 0:
return [0]
remainders = []
while n > 0:
remainders.append(n % 2)
n //= 2
return remainders[::-1]
test_values = [11, 0, 1, 42, 255, 1000]
print("দশমিক | আমার-বাইনারি | রাউন্ড-ট্রিপ ফেরত | bin() cross-check | ইনভার্স ঠিক আছে?")
print("-" * 92)
for n in test_values:
my_bits = decimal_to_binary(n)
my_bin_str = "".join(str(b) for b in my_bits)
round_trip = binary_to_decimal(my_bits)
py_bin_str = bin(n)[2:]
inverse_ok = (round_trip == n) and (my_bin_str == py_bin_str)
print(f"{n:>5} | {my_bin_str:>12} | {round_trip:>16} | {py_bin_str:>12} | {'হ্যাঁ' if inverse_ok else 'না!'}")
print()
print("সাধারণ বেস কনভার্সন -- দশমিককে মধ্যবর্তী স্টেশন ধরে অক্টাল -> হেক্স")
print("-" * 68)
def to_decimal(digits, base):
"""যেকোনো বেসের অঙ্ক-তালিকা (MSB প্রথমে) -> দশমিক -- সাধারণীকৃত পজিশনাল সমষ্টি"""
n = len(digits)
return sum(d * (base ** (n - 1 - i)) for i, d in enumerate(digits))
def from_decimal(n, base):
"""দশমিক -> যেকোনো বেসের অঙ্ক-তালিকা -- বার বার base দিয়ে ভাগ করে ভাগশেষ সংগ্রহ"""
if n == 0:
return [0]
digits = []
while n > 0:
digits.append(n % base)
n //= base
return digits[::-1]
chars = "0123456789ABCDEF"
octal_52 = [5, 2] # অক্টাল "52"
decimal_value = to_decimal(octal_52, 8)
hex_digits = from_decimal(decimal_value, 16)
hex_str = "".join(chars[d] for d in hex_digits)
print(f"অক্টাল 52 -> দশমিক {decimal_value} -> হেক্স {hex_str}")
print(f"যাচাই: Python int('52', 8) = {int('52', 8)}, hex({decimal_value})[2:].upper() = {hex(decimal_value)[2:].upper()}")
decimal_to_binary ও binary_to_decimal ঠিক একে অপরের বিপরীত কাজ করে —
একটি দিয়ে রূপান্তর করে অন্যটি দিয়ে ফেরত আনলে সবসময় মূল সংখ্যা পাওয়া যায়। এবং অক্টাল "52" দশমিক 42 হয়ে
হেক্স "2A"-তে পরিণত হয় — ঠিক L02-এর নিবল-গ্রুপিং উদাহরণের সাথে মিলে যাচ্ছে, শুধু ভিন্ন পথে (দশমিক হয়ে) একই
গন্তব্যে পৌঁছানো।
বাইনারি-দশমিক রূপান্তরের দুই দিকই একই পজিশনাল-সিস্টেম নীতির দুটো প্রয়োগ মাত্র — একদিকে "প্লেস ভ্যালু যোগ করা," অন্যদিকে "বার বার ভাগ করে ভাগশেষ সংগ্রহ করা।" দশমিককে মধ্যবর্তী স্টেশন ধরলে এই একই নীতি যেকোনো দুটি বেসের মধ্যে সাধারণীকরণ করা যায় — এটাই কম্পিউটিং-এ ব্যবহৃত সবচেয়ে মৌলিক রূপান্তর কৌশল।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ দশমিক-থেকে-বাইনারি রূপান্তরে ভাগশেষগুলো কেন উল্টো ক্রমে পড়তে হয় — যে ক্রমে বের হয়েছে সেই ক্রমেই পড়লে সমস্যা কী?
প্রথম ভাগশেষটি সবসময় সবচেয়ে ছোট প্লেস ভ্যালুর (position 0, রাইটমোস্ট) বিট নির্ধারণ করে, কারণ সেটাই সংখ্যাটিকে ২ দিয়ে ভাগ করার প্রথম ধাপ — অর্থাৎ "সংখ্যাটি জোড় না বিজোড়" সেই প্রশ্নের উত্তর। যেহেতু আমরা সবসময় বাইনারি সংখ্যা লিখি সবচেয়ে গুরুত্বপূর্ণ বিট (MSB) প্রথমে রেখে, তাই প্রথম-প্রাপ্ত (সবচেয়ে কম গুরুত্বপূর্ণ) ভাগশেষটিকেই সবার শেষে বসাতে হয় — তাই উল্টো ক্রমে পড়া আবশ্যক।
প্র ০২ বাইনারি-থেকে-দশমিক ও দশমিক-থেকে-বাইনারি কি সবসময়ই একে অপরের নিখুঁত ইনভার্স, নাকি কোনো ব্যতিক্রম হতে পারে?
এই পাঠে যেভাবে বাস্তবায়ন করা হয়েছে — কোনো নির্দিষ্ট বিট-দৈর্ঘ্যের সীমাবদ্ধতা ছাড়াই — হ্যাঁ, সবসময়ই নিখুঁত ইনভার্স, যেকোনো অ-ঋণাত্মক পূর্ণসংখ্যার জন্য। তবে বাস্তব হার্ডওয়্যারে সংখ্যা সবসময় একটি নির্দিষ্ট বিট-দৈর্ঘ্যে (যেমন 8-বিট, 32-বিট) সংরক্ষিত হয় — যদি একটি সংখ্যা সেই নির্দিষ্ট দৈর্ঘ্যে ধরে না, তাহলে "ওভারফ্লো" ঘটে এবং রূপান্তর আর নিখুঁত থাকে না। এই সীমাবদ্ধতা এবং ঋণাত্মক সংখ্যা কীভাবে বাইনারিতে প্রকাশ করা হয়, তা M4-এর L18 (Two's Complement)-এ বিস্তারিত আসবে।
প্র ০৩ সাধারণ বেস কনভার্সনে সবসময় দশমিককে "মধ্যবর্তী স্টেশন" ব্যবহার করা হয় কেন — অক্টাল থেকে সরাসরি হেক্সে যাওয়া যায় না?
সরাসরি যাওয়া আসলে সম্ভব — যদি দুটো বেসই একে অপরের সাথে 2-এর ঘাত-সম্পর্কে থাকে, ঠিক যেমন L02-এর নিবল গ্রুপিং ট্রিক অক্টাল/হেক্সকে সরাসরি বাইনারির সাথে যুক্ত করেছিল। কিন্তু সেটা একটা বিশেষ শর্টকাট, সাধারণ নিয়ম নয় — যদি বেস দুটির মধ্যে এমন কোনো সরাসরি ঘাত-সম্পর্ক না থাকে (যেমন বেস 7 থেকে বেস 13-এ যেতে হলে), তখন দশমিকের মধ্য দিয়ে যাওয়াই একমাত্র সহজ, সর্বজনীন পদ্ধতি — এই কারণেই এই পাঠের কোড দশমিককে "মধ্যবর্তী স্টেশন" হিসেবে ব্যবহার করেছে।
অনুশীলন
-
চিন্তা করুন: দশমিক 19-কে বার বার ২ দিয়ে ভাগ করে হাতে-কলমে বাইনারিতে রূপান্তর করুন (প্রতিটি ভাগ ও ভাগশেষ লিখুন), তারপর উত্তর মিলিয়ে দেখুন।
19÷2=9 ভাগশেষ 1, 9÷2=4 ভাগশেষ 1, 4÷2=2 ভাগশেষ 0, 2÷2=1 ভাগশেষ 0, 1÷2=0 ভাগশেষ 1। ভাগশেষগুলো ক্রমে: 1,1,0,0,1 — উল্টো ক্রমে পড়লে: 1,0,0,1,1 → বাইনারি "10011"। যাচাই: 16+0+0+2+1 = 19 — মিলে গেছে।
-
পরীক্ষা করুন: "সবচেয়ে বড় ঘাত বিয়োগ" পদ্ধতিতে দশমিক 11-কে রূপান্তর করলে যে বাইনারি পাওয়া যায়, তা কি ঠিক এই পাঠের ধাপ ২-এ বার বার-ভাগ পদ্ধতিতে পাওয়া ফলাফলের সাথে মিলবে? কেন মিলবে (বা মিলবে না)?
হ্যাঁ, সবসময় মিলবে। 11−8=3 (বিট 3 সেট), 3−2=1 (বিট 1 সেট), 1−1=0 (বিট 0 সেট) → "1011" — ঠিক বার বার-ভাগ পদ্ধতিতে পাওয়া "1011"-এর সাথেই মিলে যায়। এটা মিলবেই, কারণ দুটো পদ্ধতিই একই অন্তর্নিহিত পজিশনাল-সিস্টেম সত্যকে ভিন্নভাবে বের করছে মাত্র — কোনো সংখ্যার বাইনারি প্রতিরূপ একটাই, তাকে বের করার পথ একাধিক হতে পারে।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ নাম্বার সিস্টেম থেকে বুলিয়ান অ্যালজেব্রা, লজিক গেট ও সম্পূর্ণ CPU ডিজাইন পর্যন্ত — সম্পূর্ণ সিলেবাস দেখুন।
- পূর্ববর্তী পাঠ L02 নাম্বার সিস্টেম — বাইনারি, অক্টাল, হেক্সাডেসিমেল — পজিশনাল সিস্টেম ও নিবল গ্রুপিং ট্রিকের ভিত্তি।
- পরবর্তী পাঠ L04 বুলিয়ান অ্যালজেব্রা ও লজিক গেট — নাম্বার সিস্টেম থেকে যুক্তিবিদ্যা ও গেটে যাত্রা।
- সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, DBMS, Discrete Mathematics, System Design, Cybersecurity, Cloud Computing & DevOps, Computer Networks, Operating Systems ও Computer Architecture — সব এক জায়গায়।