বাইনারি, অক্টাল এবং হেক্সাডেসিমাল (একে হেক্স নামেও বলা হয়) ভিন্ন ভিত্তির ভিন্ন ভিন্ন সংখ্যা পদ্ধতি। বাইনারির ভিত্তি ২, অক্টালের ভিত্তি ৮, আর হেক্সাডেসিমালের ভিত্তি ১৬। পাইথনে সাধারণ ইন্টিজারগুলোর ভিত্তি ১০। বাইনারি, অক্টাল এবং হেক্সাডেসিমাল সবই ইন্টিজারের বিভিন্ন রূপ। অর্থাৎ এগুলো ভগ্নাংশ বা দশমিক ছাড়াই ধনাত্মক ও ঋণাত্মক সংখ্যা (শূন্যসহ) প্রকাশ করে এবং ইন্টিজার দিয়ে আমরা যে সব অপারেশন করতে পারি, সেগুলোও সমর্থন করে।
বাইনারি একটি ভিত্তি ২-এর সংখ্যা পদ্ধতি, যেখানে শুধু ০ এবং ১ অঙ্ক ব্যবহার করা হয়। এটি সাধারণত কম্পিউটারের ট্রানজিস্টর ও সুইচের মধ্য দিয়ে বিদ্যুৎ প্রবাহের ০ ("বন্ধ") এবং ১ ("চালু") অবস্থা বোঝায়, আর চৌম্বকীয় স্টোরেজ মাধ্যমের ধনাত্মক ও ঋণাত্মক চার্জও বোঝায়। বাইনারি দিয়ে ভিত্তি ১০-এ ব্যবহৃত সব ইন্টিজার প্রকাশ করা যায়।
ভিত্তি ২ পদ্ধতির একটি অংশ দেখতে এমন, যদিও এটি অসীমভাবে চলতে থাকে এবং ১২৮-এ থেমে যায় না:
| ১২৮ | ৬৪ | ৩২ | ১৬ | ৮ | ৪ | ২ | ১ |
|---|---|---|---|---|---|---|---|
| ২ ** ৭ | ২ ** ৬ | ২ ** ৫ | ২ ** ৪ | ২ ** ৩ | ২ ** ২ | ২ ** ১ | ২ ** ০ |
তাহলে আমরা যদি ৬ সংখ্যাটি বাইনারিতে প্রকাশ করতে চাই, সেটি হবে ১১০।
| স্থানীয় মান | ৪ | ২ | ১ |
|---|---|---|---|
| বাইনারি সংখ্যা | ১ | ১ | ০ |
আর হিসাবটি হবে: 4 + 2 + 0 = 6
আরেকটি উদাহরণ: ১৯
| স্থানীয় মান | ১৬ | ৮ | ৪ | ২ | ১ |
|---|---|---|---|---|---|
| বাইনারি সংখ্যা | ১ | ০ | ০ | ১ | ১ |
বাইনারি সংখ্যাটি হবে: ১০০১১
আর হিসাবটি হবে: 16 + 0 + 0 + 2 + 1 = 19
পাইথনে আমরা 0b প্রিফিক্স ব্যবহার করে বাইনারি লিটারেল প্রকাশ করতে পারি।
যদি আমরা 0b10011 লিখি, পাইথন এটিকে একটি বাইনারি সংখ্যা হিসেবে ব্যাখ্যা করবে এবং ভিত্তি ১০-এ রূপান্তর করবে।
>>> 0b10011
19
>>> type(0b10011)
<class 'int'>
পাইথনে বাইনারি আসলে একটি ইন্টিজার লেখার ভিন্ন একটি উপায়, তাই সব গাণিতিক অপারেশনের ক্ষেত্রে বাইনারি রূপটি একটি ইন্টিজার।
আপনি যদি 0b প্রিফিক্স দিয়ে এমন একটি সংখ্যা লেখেন যা বাইনারি পদ্ধতির নয়, তাহলে এটি একটি SyntaxError রেইজ করবে।
Traceback (most recent call last):
File "c:\binary.py", line 1, in <module>
0b10211
SyntaxError: invalid digit '2' in binary literal
যেহেতু বাইনারি সংখ্যাগুলো ইন্টিজার, তাই ইন্টিজার দিয়ে যা যা করা যায়, সবই এগুলো দিয়ে করা যায়।
# addition
>>> 0b10011 + 0b10011
38
# multiplication
>>> 0b10011 * 0b10011
361
আমরা বাইনারি ও ইন্টিজার, দুই রূপের মধ্যে মিশ্র অপারেশনও করতে পারি।
তবে গাণিতিক অপারেটরের স্বাভাবিক নিয়মই এখানে খাটে: দুটি বাইনারি সংখ্যা বা ইন্টিজার সংখ্যা ভাগ করলে একটি float রিটার্ন আসবে, এমনকি ভাগফলে দশমিক অংশ না থাকলেও।
>>> 0b10011 + 19
38
>>> 0b10011/0b10011
1.0
>>> 0b10011/3
6.333333333333333
পাইথন একটি বাইনারি লিটারেলকে স্বয়ংক্রিয়ভাবে int-এ রূপান্তর করে।
একটি int-কে বাইনারি রূপে রূপান্তর করতে বিল্ট-ইন [bin()][bin] ফাংশনটি ব্যবহার করুন।
bin() বাইনারি সমতুল্যের একটি str রিটার্ন করবে, শুরুতে 0b প্রিফিক্স সহ।
>>> bin(19)
'0b10011'
একটি বাইনারি লিটারেলকে ইন্টিজারে রূপান্তর করতে আমরা বিল্ট-ইন int() ফাংশন ব্যবহার করতে পারি এবং আর্গুমেন্ট হিসেবে বাইনারি রূপের একটি স্ট্রিং ও ভিত্তি পাস করতে পারি:
>>> int("0b10011", 2)
19
ভুল ভিত্তি (অথবা অবৈধ একটি বাইনারি রূপ) দিলে একটি ValueError রেইজ হবে:
Traceback (most recent call last):
File "c:\binary.py", line 4, in <module>
int("0b10011", 3)
ValueError: invalid literal for int() with base 3: '0b10011'
বাইনারি সংখ্যার ওপর ব্যবহার করার মতো কিছু বিশেষ মেথডও আছে।
<int>.bit_length() সংখ্যাটি প্রকাশ করতে কতগুলো বিট দরকার, সেই সংখ্যা রিটার্ন করবে:
>>> 0b11011.bit_length()
5
<int>.bit_count() বাইনারি সংখ্যাটিতে কতগুলো এক আছে, তার সংখ্যা রিটার্ন করবে।
উদাহরণস্বরূপ, '0b11011'-এর ওপর bit_count() চালালে ৪ রিটার্ন আসবে:
>>> 0b11011.bit_count()
4
আপনি যদি নিজের কম্পিউটারে কাজ করেন, তাহলে bit_count() ব্যবহার করতে কমপক্ষে Python 3.10 দরকার।
Exercism-এর অনলাইন এডিটর বর্তমানে Python 3.11 পর্যন্ত সব ফিচার সমর্থন করে।
অক্টাল একটি ভিত্তি ৮-এর সংখ্যা পদ্ধতি। এটি ০, ১, ২, ৩, ৪, ৫, ৬ এবং ৭ অঙ্ক ব্যবহার করে।
পাইথনে আমরা 0o প্রিফিক্স দিয়ে অক্টাল সংখ্যা প্রকাশ করতে পারি।
বাইনারির মতোই, পাইথন একটি অক্টাল রূপকে স্বয়ংক্রিয়ভাবে int-এ রূপান্তর করে।
>>> 0o123
83
বাইনারির মতোই, অক্টাল সংখ্যা আসলে int এবং ইন্টিজারের সব অপারেশনই সমর্থন করে।
অক্টাল পদ্ধতির নয় এমন সংখ্যার আগে 0o বসালে একটি SyntaxError রেইজ হবে।
একটি int-কে অক্টাল রূপে রূপান্তর করতে আপনি বিল্ট-ইন [oct()][oct] ফাংশন ব্যবহার করতে পারেন।
এটি bin() ফাংশনের মতোই কাজ করে এবং একটি স্ট্রিং রিটার্ন করে:
>>> oct(83)
'0o123'
একটি অক্টাল সংখ্যাকে ইন্টিজারে রূপান্তর করতে আমরা int() ফাংশন ব্যবহার করতে পারি এবং আর্গুমেন্ট হিসেবে অক্টাল স্ট্রিং রূপ ও ভিত্তি (৮) পাস করতে পারি:
>>> int("0o123", 8)
83
বাইনারির মতোই, ভুল ভিত্তি দিলে একটি ValueError রেইজ হবে।
হেক্সাডেসিমাল একটি ভিত্তি ১৬-এর সংখ্যা পদ্ধতি। এটি ০ থেকে ৯ অঙ্ক এবং A, B, C, D, E ও F অক্ষর ব্যবহার করে। A মানে ১০, B মানে ১১, C মানে ১২, D মানে ১৩, E মানে ১৪ এবং F মানে ১৫।
পাইথনে আমরা 0x প্রিফিক্স দিয়ে হেক্সাডেসিমাল সংখ্যা প্রকাশ করতে পারি।
বাইনারি ও অক্টালের মতোই, পাইথন হেক্সাডেসিমাল লিটারেলকে স্বয়ংক্রিয়ভাবে int-এ রূপান্তর করে।
>>> 0x123
291
বাইনারি ও অক্টালের মতোই, হেক্সাডেসিমাল লিটারেলও আসলে int, আর এগুলো দিয়ে ইন্টিজারের সব অপারেশন করা যায়।
হেক্সাডেসিমাল নয় এমন সংখ্যার আগে 0x বসালে একটি SyntaxError রেইজ হবে।
একটি int-কে হেক্সাডেসিমাল রূপে রূপান্তর করতে আপনি বিল্ট-ইন [hex()][hex] ফাংশন ব্যবহার করতে পারেন।
এটি bin() ফাংশনের মতোই কাজ করে এবং একটি স্ট্রিং রিটার্ন করে:
>>> hex(291)
'0x123'
একটি হেক্সাডেসিমাল রূপকে ইন্টিজারে রূপান্তর করতে আমরা int() ফাংশন ব্যবহার করতে পারি এবং আর্গুমেন্ট হিসেবে হেক্সাডেসিমাল স্ট্রিং ও ভিত্তি (১৬) পাস করতে পারি:
>>> int("0x123", 16)
291
বাইনারি ও অক্টালের মতোই, ভুল ভিত্তি দিলে একটি ValueError রেইজ হবে।