পাঠ ০২ · ৫৭-এর মধ্যে · মডিউল ১
Home / Courses / Computer Architecture & Digital Logic / নাম্বার সিস্টেম

নাম্বার সিস্টেম — বাইনারি, অক্টাল, হেক্সাডেসিমেল

Number systems — binary, octal & hexadecimal
৮ মিনিট পড়া শুরু · Beginner Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • পজিশনাল নাম্বার সিস্টেম কী এবং প্লেস ভ্যালু কীভাবে কাজ করে
  • বাইনারি, অক্টাল, হেক্সাডেসিমেল — প্রতিটির অঙ্কসমূহ ও সংজ্ঞা
  • কেন হার্ডওয়্যার শুধু বাইনারি ব্যবহার করে, আর অক্টাল/হেক্স কেন নিছক "শর্টহ্যান্ড" মাত্র
  • নিবল (৪-বিট) গ্রুপিং ট্রিক দিয়ে বাইনারি থেকে সরাসরি হেক্সে রূপান্তর করার পদ্ধতি

১ · পজিশনাল নাম্বার সিস্টেম কী

আমরা যে দশমিক (decimal) সংখ্যা প্রতিদিন ব্যবহার করি, তা একটি পজিশনাল নাম্বার সিস্টেমPositional Number Systemযে সংখ্যা-পদ্ধতিতে একটি অঙ্কের প্রকৃত মান শুধু অঙ্কটির উপর নয়, বরং সংখ্যার মধ্যে তার অবস্থানের (position) উপরও নির্ভর করে। — এখানে প্রতিটি অঙ্কের প্রকৃত মান নির্ভর করে দুটি জিনিসের উপর: অঙ্কটি নিজে কী, আর সংখ্যার মধ্যে তার অবস্থান (position) কোথায়। যেমন 345-এ "3" আসলে 300 বোঝায়, কারণ সে শততম অবস্থানে বসে আছে। সাধারণভাবে লেখা যায়:

$$N = \sum_{i} d_i \times b^i$$

এখানে baseসংখ্যা-পদ্ধতিতে ব্যবহৃত মোট আলাদা অঙ্কের সংখ্যা — দশমিকে ১০টি অঙ্ক (0-9) তাই base 10। (b) হলো সেই সিস্টেমে মোট কতগুলো ভিন্ন অঙ্ক আছে, আর i হলো ডানদিক থেকে গোনা অবস্থান (rightmost = 0)। দশমিকে (base 10, অঙ্ক 0-9): 345 = 3×10² + 4×10¹ + 5×10⁰ = 300+40+5 = 345 — এটাই আমরা স্বাভাবিকভাবে ভাবি, কিন্তু এই একই নিয়ম যেকোনো বেসেই প্রযোজ্য।

২ · বাইনারি — হার্ডওয়্যারের নিজস্ব ভাষা

বাইনারিBinary (Base 2)শুধু দুটি অঙ্ক (0, 1) ব্যবহার করে এমন নাম্বার সিস্টেম — হার্ডওয়্যার সরাসরি বোঝে এমন একমাত্র সিস্টেম। (base 2) শুধুমাত্র দুটি অঙ্ক ব্যবহার করে — 0 ও 1। এটাই একমাত্র নাম্বার সিস্টেম যা হার্ডওয়্যার সরাসরি বোঝে, কারণ L01-এ যেমন দেখেছি, একটি ট্রানজিস্টর স্বাভাবিকভাবেই দুই-অবস্থার সুইচ — হয় লো ভোল্টেজ (0) নয়তো হাই ভোল্টেজ (1)। প্রতিটি বাইনারি অঙ্ককে বলা হয় একটি bitBit"Binary Digit"-এর সংক্ষিপ্ত রূপ — একটি একক বাইনারি অঙ্ক (0 অথবা 1), তথ্যের সবচেয়ে ছোট একক। ("binary digit"-এর সংক্ষিপ্ত রূপ)। বাইনারিতে 1011 মানে: 1×2³ + 0×2² + 1×2¹ + 1×2⁰ = 8+0+2+1 = 11 (দশমিকে) — এই রূপান্তরের বিস্তারিত পদ্ধতি আসবে পরের পাঠে (L03)।

৩ · অক্টাল ও হেক্সাডেসিমেল — বাইনারির শর্টহ্যান্ড

কাঁচা বাইনারি পড়া মানুষের জন্য কষ্টকর — একটি সাধারণ সংখ্যাও অনেক লম্বা বিট-স্ট্রিং হয়ে যায় (যেমন দশমিক 172 বাইনারিতে 10101100)। তাই দুটি "শর্টহ্যান্ড" সিস্টেম ব্যবহার করা হয় — অক্টালOctal (Base 8)০-৭ পর্যন্ত ৮টি অঙ্ক ব্যবহার করে এমন সিস্টেম — প্রতিটি অক্টাল অঙ্ক ঠিক ৩টি বাইনারি বিটের সমান। (base 8, অঙ্ক 0-7) ও হেক্সাডেসিমেলHexadecimal (Base 16)০-৯ এর পর A-F ব্যবহার করে মোট ১৬টি অঙ্ক — প্রতিটি হেক্স অঙ্ক ঠিক ৪টি বাইনারি বিটের সমান। (base 16, অঙ্ক 0-9 তারপর A-F, যেখানে A=10, B=11, ..., F=15)। এই দুটো "শর্টহ্যান্ড" হওয়ার আসল কারণ খাঁটি গণিত: 8 = 2³ এবং 16 = 2⁴ — অর্থাৎ প্রতিটি অক্টাল অঙ্ক ঠিক ৩-বিট বাইনারি গ্রুপের সমান, আর প্রতিটি হেক্স অঙ্ক ঠিক ৪-বিট গ্রুপের (একে বলা হয় nibbleNibbleঠিক ৪টি বিটের একটি গ্রুপ — একটি হেক্স অঙ্কের ঠিক সমান।) সমান।

এই সম্পর্কের কারণে রূপান্তর কোনো অঙ্ক-ভিত্তিক গণনা ছাড়াই সরাসরি করা যায় — বাইনারি সংখ্যাকে ডান দিক থেকে ৪-বিট গ্রুপে (নিবলে) ভাগ করে প্রতিটি নিবলকে সরাসরি একটি হেক্স অঙ্কে বদলে দিলেই হলো। উদাহরণ: বাইনারি 10101100 কে দুটি নিবলে ভাগ করুন — 1010 এবং 1100। 1010 = দশমিক 10 = হেক্স A, আর 1100 = দশমিক 12 = হেক্স C। তাই 10101100 = হেক্স AC।

বাইনারি: 1 0 1 0 1 1 0 0 নিবল ১: 1010 নিবল ২: 1100 = হেক্স A = হেক্স C
প্রতিটি ৪-বিট নিবল সরাসরি একটি হেক্স অঙ্কে বদলে যায় — মিলে হয় "AC"। কোনো ভাগ-ভাগশেষ গণনা লাগে না, শুধু নিবলে ভাগ করে টেবিল দেখা।

৪ · কেন হেক্সাডেসিমেল ব্যবহারিক স্ট্যান্ডার্ড

বাইনারি
হার্ডওয়্যারের নিজস্ব ভাষা — কিন্তু মানুষের পড়ার জন্য অতিরিক্ত লম্বা।
অক্টাল
ঐতিহাসিকভাবে ব্যবহৃত (যেমন পুরনো Unix ফাইল পারমিশন — chmod 755), এখন তুলনামূলক কম দেখা যায়।
হেক্সাডেসিমেল
মেমরি অ্যাড্রেস, কালার কোড (#39B549), MAC অ্যাড্রেস, মেশিন কোড ডাম্প — সংক্ষিপ্ত অথচ বাইনারিতে তুচ্ছ রূপান্তরযোগ্য।

দশমিকের তুলনায় হেক্স এখানে এগিয়ে, কারণ দশমিকে রূপান্তর করতে হলে প্রকৃত অঙ্ক-ভিত্তিক গণনা (ভাগ-ভাগশেষ) দরকার হয় (L03-এ দেখবেন) — কিন্তু হেক্সে রূপান্তর শুধু নিবল-গ্রুপিং টেবিল দেখেই তাৎক্ষণিকভাবে করা যায়, কারণ 16 সরাসরি 2-এর একটি ঘাত।

Python
# বেস রূপান্তর -- আমার নিজের ভাগ-ভাগশেষ পদ্ধতি বনাম Python-এর বিল্ট-ইন bin()/oct()/hex() দিয়ে ক্রস-চেক
def to_base(n, base):
    """n-কে base ভিত্তিক অঙ্কের তালিকায় রূপান্তর করে (সবচেয়ে গুরুত্বপূর্ণ অঙ্ক প্রথমে) -- ভাগ-ভাগশেষ পদ্ধতি"""
    if n == 0:
        return [0]
    digits = []
    while n > 0:
        digits.append(n % base)
        n //= base
    return digits[::-1]

def digits_to_str(digits):
    chars = "0123456789ABCDEF"
    return "".join(chars[d] for d in digits)

test_values = [10, 42, 255, 100]

print("দশমিক | আমার-বাইনারি vs bin() | আমার-অক্টাল vs oct() | আমার-হেক্স vs hex() | মিলেছে?")
print("-" * 82)
for n in test_values:
    my_bin, py_bin = digits_to_str(to_base(n, 2)), bin(n)[2:]
    my_oct, py_oct = digits_to_str(to_base(n, 8)), oct(n)[2:]
    my_hex, py_hex = digits_to_str(to_base(n, 16)), hex(n)[2:].upper()
    match = "হ্যাঁ" if (my_bin, my_oct, my_hex) == (py_bin, py_oct, py_hex) else "না!"
    print(f"{n:>4}  |  {my_bin:>10} vs {py_bin:<10} |  {my_oct:>6} vs {py_oct:<6} |  {my_hex:>4} vs {py_hex:<4} | {match}")

print()
print("নিবল (৪-বিট) গ্রুপিং ট্রিক -- বাইনারি স্ট্রিং থেকে সরাসরি হেক্স")
print("-" * 68)

def nibble_grouping_to_hex(binary_str):
    """বাম দিকে প্রয়োজনমতো শূন্য বসিয়ে ৪-বিট নিবলে ভাগ করে প্রতিটি নিবলকে হেক্স অঙ্কে বদলায়"""
    pad_len = (-len(binary_str)) % 4
    padded = "0" * pad_len + binary_str
    chars = "0123456789ABCDEF"
    return "".join(chars[int(padded[i:i + 4], 2)] for i in range(0, len(padded), 4))

for n in (42, 172, 202):
    b = bin(n)[2:]
    trick_hex = nibble_grouping_to_hex(b)
    real_hex = hex(n)[2:].upper()
    print(f"{n:>3} -> বাইনারি {b:>8} -> নিবল গ্রুপিং দিয়ে হেক্স {trick_hex:>3}  (Python hex(): {real_hex})")

    
লক্ষ্য করুন 42 (বাইনারি 101010, মাত্র ৬ বিট) নিবল গ্রুপিংয়ে "00101010" হিসেবে প্যাড হয় — বাম দিকে শূন্য বসালে সংখ্যার মান পরিবর্তন হয় না, শুধু বিট-দৈর্ঘ্যকে ৪-এর গুণিতকে আনা হয়। এরপর "0010"=2 আর "1010"=A, মিলে "2A" — যা ঠিক Python-এর hex(42) এর সাথে মেলে।
মূল কথা · Key takeaway

প্রতিটি বেস আসলে একই তথ্যের একটি ভিন্ন "ভাষার রূপ" মাত্র — অন্তর্নিহিত সংখ্যাটি একই থাকে। বাইনারি হার্ডওয়্যারের জন্য, দশমিক মানুষের জন্য স্বাভাবিক, আর অক্টাল/হেক্স এই দুইয়ের মাঝখানে সেতু — বিশেষ করে হেক্স, কারণ এর সাথে বাইনারির সম্পর্ক (16=2⁴) সরাসরি গাণিতিক, কোনো জটিল রূপান্তর ছাড়াই।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ কেন কম্পিউটার সরাসরি দশমিক ব্যবহার করে না — বাইনারিই কেন বাধ্যতামূলক?

কারণ ব্যাপারটা সুবিধার প্রশ্ন নয়, বাস্তবতার প্রশ্ন। L01-এ দেখা হয়েছে যে হার্ডওয়্যারের সবচেয়ে মৌলিক একক — ট্রানজিস্টর — স্বাভাবিকভাবেই একটি দুই-অবস্থার সুইচ (অন/অফ, হাই ভোল্টেজ/লো ভোল্টেজ)। দশ-অবস্থার একটি নির্ভরযোগ্য ফিজিক্যাল সুইচ ডিজাইন করা কঠিন ও ব্যয়বহুল, কিন্তু দুই-অবস্থার সুইচ সহজ ও নির্ভরযোগ্য। তাই বাইনারি হার্ডওয়্যারের জন্য "পছন্দ" নয়, বরং সবচেয়ে বাস্তবসম্মত পথ।

প্র ০২ অক্টাল সিস্টেম কি এখন প্রায় অপ্রচলিত? তাহলে এটা কেন এখনো শেখানো হয়?

বাস্তব ব্যবহারে হেক্স এখন অনেক বেশি প্রচলিত (মেমরি অ্যাড্রেস, কালার কোড ইত্যাদিতে), আর অক্টাল সাধারণত পুরনো সিস্টেমেই বেশি দেখা যায় (যেমন Unix ফাইল পারমিশন — chmod 755)। কিন্তু অক্টাল শেখানোর আসল কারণ ধারণাগত — এটি প্রমাণ করে যে "৩-বিট গ্রুপিং একটি সিস্টেমেও কাজ করে, ৪-বিট গ্রুপিং আরেকটিতেও করে" — একই পজিশনাল-সিস্টেম নীতি বিভিন্ন বেসে কীভাবে প্রযোজ্য হয়, তা বোঝার জন্য এটি একটি ভালো দ্বিতীয় উদাহরণ।

প্র ০৩ নিবল গ্রুপিং ট্রিকটি হেক্সের জন্য এত সহজে কাজ করে কেন, কিন্তু দশমিকের জন্য একই রকম কোনো "শর্টকাট" নেই কেন?

কারণ 16 = 2⁴ — একটি সরাসরি, নির্ভুল ঘাত-সম্পর্ক, যেখানে প্রতিটি হেক্স অঙ্ক ঠিক ৪টি বাইনারি বিটের সাথে এক-এক (bijective) সম্পর্কে থাকে, কোনো "ওভারফ্লো" বা গ্রুপ-থেকে-গ্রুপে ক্যারি ছাড়াই। কিন্তু 10 (দশমিকের বেস) 2-এর কোনো ঘাত নয়, তাই বাইনারি বিটগুলোকে কোনো নির্দিষ্ট আকারের গ্রুপে ভাগ করে সরাসরি দশমিক অঙ্কে বদলানো সম্ভব না — দশমিকে যেতে হলে প্রকৃত অঙ্ক-ভিত্তিক গণনা (ভাগ-ভাগশেষ) লাগবেই, যা ঠিক L03-এর বিষয়।

অনুশীলন

  1. চিন্তা করুন: বাইনারি 11110000 কে নিবল গ্রুপিং ট্রিক ব্যবহার করে হাতে-কলমে হেক্সে রূপান্তর করুন (কোড না চালিয়ে), তারপর নিচে উত্তর মিলিয়ে দেখুন।

    11110000 কে দুটি নিবলে ভাগ করুন: 1111 এবং 0000। 1111 = দশমিক 15 = হেক্স F, আর 0000 = দশমিক 0 = হেক্স 0। তাই ফলাফল হেক্স "F0" — চাইলে Python-এ hex(0b11110000) চালিয়ে নিজেই যাচাই করতে পারেন, ফলাফল একই আসবে।

  2. পরীক্ষা করুন: একই নিবল-গ্রুপিং ট্রিকটি যদি হেক্সের বদলে অক্টালে রূপান্তরের জন্য প্রয়োগ করতে চান (এখনো কোড পরিবর্তন করবেন না), গ্রুপের আকার কত বিটের হওয়া উচিত, এবং কেন?

    গ্রুপের আকার হতে হবে ৩ বিট, ৪ বিট নয় — কারণ অক্টাল হলো base 8, আর 8 = 2³ (2⁴ নয়)। উদাহরণ: দশমিক 42-এর বাইনারি 101010 কে ৩-বিট গ্রুপে ভাগ করলে পাওয়া যায় 101 এবং 010 — 101 = দশমিক 5, আর 010 = দশমিক 2 — মিলে অক্টাল "52", যা এই পাঠের কোড সেলের টেবিলে দেখানো ফলাফলের সাথে ঠিক মিলে যায়।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

  • কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ নাম্বার সিস্টেম থেকে শুরু করে বুলিয়ান অ্যালজেব্রা, লজিক গেট ও সম্পূর্ণ CPU ডিজাইন পর্যন্ত — সম্পূর্ণ সিলেবাস দেখুন।
  • পূর্ববর্তী পাঠ L01 কম্পিউটার আর্কিটেকচার ও ডিজিটাল লজিক কী ও কেন গুরুত্বপূর্ণ — না পড়ে থাকলে আগে এটি দেখে নিন।
  • পরবর্তী পাঠ L03 বাইনারি-ডেসিমেল কনভার্সন ও বেস কনভার্সন — বাইনারি ও দশমিকের মধ্যে প্রকৃত অঙ্ক-ভিত্তিক রূপান্তর অ্যালগরিদম।
  • সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, DBMS, Discrete Mathematics, System Design, Cybersecurity, Cloud Computing & DevOps, Computer Networks, Operating Systems ও Computer Architecture — সব এক জায়গায়।
আগের পাঠ
কম্পিউটার আর্কিটেকচার ও ডিজিটাল লজিক কী ও কেন গুরুত্বপূর্ণ