Sunday, November 14, 2021

Introduction to Bit Manipulation

আমরা নাম্বার সিস্টেস সম্পর্কে জানি, কোনো একটা নাম্বার কে আমরা চাইলে নির্দিষ্টএকটা বেইজে উপস্থাপন করতে পারি, এটা কিভাবে ? আর বেইজ টা'ই বা কি জিনিস?


আমরা হাটে বাজারে হিসাব নিকাশে যে অংক গুলা করে থাকি এইগুলা হচ্ছে ১০(দশ/টেন) বেইজ নাম্বার, কেনো ?
কারন এখানে ০-৯(শূন্য থেকে ৯) এর মধ্যে সংখ্যা গুলা নিয়েই কেবল আমরা কাজ করি।

সংখ্যা পদ্ধতিতে এমন কতকগুলা বেইজ নিয়ে আলোচনা করা আছে ।
যেমন আছে বাইনারি সংখ্যা, এর বেইজ ২(দুই), অর্থ্যাত এই পদ্ধতিতে শুধুমাত্র ০ এবং ১ নিয়ে কাজ করা হইছে। আবার আছে হেক্সা, অক্টা ইত্যাদি।

এই বিট ম্যানিপুলেশনে আমাদের প্রধান ফোকাস হচ্ছে বাইনারি এবং ডেসিমেল নাম্বার নিয়ে কাজ করা।

একটা ডেসিমেল(১০ বেইজ) নাম্বার কে বাইনারি(২ বেইজ) নাম্বারে কনভার্ট করা খুবই সোজ আবার এর উল্টাটা করাও অনেক সোজা, একটা ছোটো উদাহরন দিয়ে বুঝে ফেলি।

৫ একটা ডেসিমেল নাম্বার, এটাকে যদি আমরা ২ দিয়ে ভাগ করতে থাকি, এবং পরিশেষে তার রেজাল্ট গুলা উলটা দিক থেকে নিই, থাহলে সেটা হয়ে যাবে বাইনারি রিপ্রেজেন্টেশন।

এখানে কিভাবে ডেসিমেল থেকে বাইনারি, আর বাইনারি থেকে ডেসিমেল কনভার্ট করা যায় সেটা দেখানো হইছে, এটা আসলে খুবই সহজ জিনিস, না পারলে কয়েকটা প্র্যাক্টিস করলেই পারা যাবে।

ডেসিমেল থেকে বাইনারি তে নিতে হইলে বারবার ২ দিয়ে ভাগ করতে হবে, ভাগফল শূন্য(০) না হওয়া পর্যন্ত ভাগ করতে থাকতে হবে, পরিশেষে ভাগশেষ গুলা শেষ থেকে কালেক্ট করতে হবে।
 

আর বাইনারি থেকে ডেসিমেল এর ক্ষেত্রে ডান দিক থেকে শুরু করতে হবে, প্রথমটার পজিশন শুন্য। এইভাবে এক এক করে বাম দিকে যেতে হবে আর তার পজিশন অনুযায়ি ২ এর পাওয়ার দ্বারা গুন করতে হবে ।


এখন আসি কিভাবে আমরা বাইনারি ডিজিট নিয়ে কাজ করতে পারি, কেনো দরকার কিংবা কি ধরনের ওপারেশন এখানে করা যেতে পারে । বাইনারি নাম্বার সিস্টেমে প্রত্যেকটা নাম্বার কে বিট বলা হয়ে থাকে।

সাধারণ ৬(ছয়) ধরনের বিটওয়াইজ ওপারেটরস বেশি ব্যবহার করা হয়ে থাকে, একে একে সবগুলার সাথে আমরা পরিচয় হবো।

AND(&)
যদি দুইটা বাইনারি নাম্বার কে আমরা AND(&) ওপেরেশন করি তাহলে যদি দুইটা বিট ই 1 হয় তাহলে রেজাল্ট 1 হবে নতুবা 0 হবে। উদাহরন সহ দেখি,
           101010
           110011
           --------
(AND) 100010

OR(||)
এক্ষেত্রে যেকোনো একটা বিট 1 হইলেই রেজাল্ট 1 হবে, নতুবা 0 হবে।
           101010
           110011
           --------
  (OR)  111010
 

XOR(^)
এক্ষেত্রে যেকোনো দুইটা বিট 1 হইলে রেজাল্ট শুন্য হবে, অর্থ্যাত দুইটা বিট সেইম হইলে রেজাল্ট (0)শুন্য নতুবা রেজাল্ট হবে 1
           101010
           110011
           --------
(XOR)  011001

NOT(~)
এক্ষেত্রে ইনপুট জিরো(0) দিলে আউটপুট আসবে ওয়ান(1) এবং  ওয়ান(1) দিলে জিরো(0) আসবে অর্থ্যাত বিট পরিবর্তন হয়ে বিপরিত বিট আসবে।
~0 = 1
~1 =  0
~10101 = 01010


Right Shift(>>)
দুইটা খুবই ইন্টারেস্টিং বিটওয়াইজ ওপেরেটরের একটা এটি, আরেকটা নিয়ে এর পরে আলাপ হইছে।
কিভাবে লেখা হয় ?
N >> a, অর্থাৎ N একটা ডেসিমেল নাম্বার এবং এর বাইনারি রিপ্রেজেন্টেশনের ডান দিক থেকে 'a' টা বিট মুছে ফেলা হয়েছে একইসাথে বাম দিকে 'a' টা 0(zero) বিট এড করে দেয়া হয়েছে।

উদাহরন সহ দেখি,

এখানে N এর মান ২২আমরা একে ২ বার রাইট সিফট করেছি, এতে ২২ এর ডান দিকের দুইটা বিট মুছে গেছে ।
অর্থাৎ ২২>>২ = ৫

এইটা আরো একভাবে চিন্তা করা যায়,
22 >> 2 = 22/2^2 = 22/4 = 5
অর্থাৎ N কে a দ্বারা Right Shift করা মানে N কে 2^a দ্বারা ভাগ করা।








Left Shift(<<)
N << a, অর্থাৎ এক্ষেত্রে বাম দিক থেকে a টা বিট মুছে যাবে , আর ডান দিক থেকে a টা (শুন্য 0) বিট যুক্ত হবে।
আগের টার মত এটাকেও চিন্তা করা যায়।
N << a মানে হচ্ছে N কে 2^a দ্বারা গূণ করা।

3 << 2 = 3*2^2 = 12

No comments:

Post a Comment