পাইথনে বিটওয়াইজ অপারেটর {Bitwise Operators in python}

এই অপারেটরগুলি অপারেন্ডের ইন্ডিভিজুয়াল বিটের (0 এবং 1) উপর কাজ করে। আমরা সরাসরি বাইনারি সংখ্যা বা পূর্ণসংখ্যাতেও বিটওয়াইজ অপারেটর ব্যবহার করতে পারি।যখন আমরা এই অপারেটরগুলিকে পূর্ণসংখ্যাগুলিতে ব্যবহার করি, তখন এই সংখ্যাগুলি বিটে (বাইনারী নম্বর সিস্টেম) রূপান্তরিত হয় এবং তারপর বিটওয়াইজ অপারেটরগুলি সেই বিটের উপর কাজ করে। এই অপারেটরদের দেওয়া ফলাফল সর্বদা পূর্ণসংখ্যার থেকে থাকে।
আমরা আমাদের দৈনন্দিন জীবনে দশমিক সংখ্যা পদ্ধতি ব্যবহার করি। এই সংখ্যা পদ্ধতিতে 0 থেকে 9 পর্যন্ত 10টি সংখ্যা রয়েছে৷ আমরা শুধুমাত্র এই 10টি সংখ্যা ব্যবহার করে সমস্ত সংখ্যা গণনা করি৷ কিন্তু কম্পিউটারে অভ্যন্তরীণভাবে ব্যবহৃত বাইনারি সংখ্যা পদ্ধতির ক্ষেত্রে শুধুমাত্র 2টি সংখ্যা থাকে, অর্থাৎ 0 এবং 1 যাকে বিট (বাইনারী সংখ্যা) বলা হয়। সমস্ত মান শুধুমাত্র এই দুটি বিট ব্যবহার করে উপস্থাপন করা হয়। একটি দশমিক সংখ্যাকে বাইনারি সংখ্যায় রূপান্তর করা সম্ভব এবং এর বিপরীতে।

উদাহরণ 1: 45 কে বাইনারি সংখ্যা পদ্ধতিতে রূপান্তর করা।
নিয়ম: সংখ্যাটিকে ধারাবাহিকভাবে 2 দ্বারা ভাগ করুন এবং অবশিষ্টগুলিকে নীচে থেকে উপরে নিন, যেমন নিচের ছবিতে দেখানো হয়েছে। ডেসিমাল সংখ্যা 45 বাইনারিতে 101101 হিসাবে উপস্থাপন করা হয়। যদি আমরা 8 বিট উপস্থাপনা ব্যবহার করি, তাহলে আমরা এটি লিখতে পারি: 00101101।
 
Converting into Binary

উদাহরণ 2: বাইনারি সংখ্যা 00101101 কে ডেসিমাল সংখ্যায় রূপান্তর করা হচ্ছে।
নিয়ম: ইন্ডিভিজুয়াল বিটগুলিকে 2 এর পাওয়ার দ্বারা গুণ করুন এবং প্রোডাক্টস গুলির যোগফল নিন, যেমন  নিচের ছবিতে দেখানো হয়েছে। এখানে যোগফল 45 আসছে। তাই বাইনারিতে 00101101 ডেসিমাল সংখ্যা পদ্ধতিতে 45 এর সমান।
 Converting from Binary to Decimal 
নিচে দেখানো হিসাবে পাইথনে 6 ধরনের বিটওয়াইজ অপারেটর রয়েছে:
  1. বিটওয়াইজ কমপ্লিমেন্ট অপারেটর (~) {Bitwise Complement Operator (~)}
  2. বিটওয়াইজ এন্ড অপারেটর (&) {Bitwise AND Operator (&)}
  3. বিটওয়াইজ ওর  অপারেটর (|) {Bitwise OR Operator (|)}
  4. বিটওয়াইজ XOR অপারেটর (^) {Bitwise XOR Operator (^)}
  5. বিটওয়াইজ লেফট শিফট অপারেটর (<<) {Bitwise Left shift Operator (<<)}
  6. বিটওয়াইজ রাইট শিফট অপারেটর (>>) {Bitwise Right shift Operator (>>)}
আমরা একে একে এই অপারেটরদের নিয়ে আলোচনা করব।

{tocify} $title={Table of Contents}

বিটওয়াইজ কমপ্লিমেন্ট অপারেটর (~) {Bitwise Complement Operator (~)}

এই অপারেটর একটি প্রদত্ত সংখ্যার পরিপূরক ফর্ম দেয়।এই অপারেটর প্রতীক হল ~, যা টিল্ড হিসাবে উচ্চারিত হয়।একটি পসিটিভ সংখ্যার পরিপূরক ফর্ম 0 কে 1 এর হিসাবে পরিবর্তন করে এবং এর বিপরীতে প্রাপ্ত করা যেতে পারে।কমপ্লিমেন্ট অপারেশন ইলেকট্রনিক্স মধ্যে গেট সার্কিট দ্বারা সঞ্চালিত হয়। ট্রুথ টেবিল এমন একটি টেবিল যা ইনপুট এবং আউটপুটের মধ্যে সম্পর্ক দেয়।নট গেটের জন্য ট্রুথ টেবিলটিও দেওয়া হয়েছে, যেমন নিচের ছবিতে দেখানো হয়েছে।
 
x=10 #find the ~x value
x= 10 = 00001010{codeBox}

0 কে 1 এর মত পরিবর্তন করে এবং এর বিপরীতে, আমরা 1111 0101 পাই। এটি -11 (ডেসিমেল) ছাড়া আর কিছুই নয়। সুতরাং, ~x= -11। 

বিটওয়াইজ AND অপারেটর (&) {Bitwise AND Operator (&)}


এই অপারেটর পারফর্মস AND সংখ্যার পৃথক বিটের উপর অপারেশন করে থাকে। এই অপারেটরের প্রতীক হল &, যাকে বলা হয় অ্যাম্পারস্যান্ড। বিটওয়াইজ এবং অপারেশন বোঝার জন্য, চিত্রে দেওয়া ছবিটি দেখুন।

AND Operation

ছবিটি দেখে আমরা উপসংহারে আসতে পারি যে ইনপুট বিটগুলিকে গুণ করে আমরা আউটপুট বিট পেতে পারি।  

x=10;y=11 #Find the value of x&y
x=10 = 0000 1010
y=11 = 0000 1011{codeBox}

উপরের ছবিটি দেখে বিটগুলিকে গুণ করে, আমরা x&y = 0000 1010 পেতে পারি। এটি 10 (ডেসিমাল) ছাড়া আর কিছুই নয়।

বিটওয়াইজ OR অপারেটর (|) {BItwise OR Operator(|)}

এই অপারেটর সংখ্যার বিটগুলিতে OR অপারেশন করে। বিটওয়াইজ OR অপারেটর | এর চিহ্ন, যাকে পাইপ প্রতীক বলা হয়। এই অপারেশনটি বোঝার জন্য, নিচের ছবিটি দেখুন।
নিচের ছবি থেকে, আমরা উপসংহারে আসতে পারি যে ইনপুট বিট যোগ করে, আমরা আউটপুট বিট পেতে পারি। 

 
OR Operation
 
x=10; y=11 #find the value of x|y
x=10 = 00001010
y=11 = 00001011{codeBox}

ছবি থেকে বিট গুলি যোগ করে, আমরা x|y = 00001011 পেতে পারি। এটি 11 (ডেসিমাল নাম্বার) ছাড়া কিছুই না ।
 

বিটওয়াইজ XOR অপারেটর (^) {Bitwise XOR Operator (^)}

এই অপারেটর সংখ্যার বিটের উপর এক্সক্লুসিভ বা (xor) অপারেশন করে।চিহ্ন হল ^, যাকে ক্যাপ, ক্যারেট বা সার্কামফ্লেক্স সিম্বল বলা হয়।XOR অপারেশন বোঝার জন্য, নিচের ছবিটি দেখুন। ছবিটি থেকে আমরা উপসংহারে আসতে পারি যে যখন আমাদের ইনপুট বিটে 1 এর বিজোড় সংখ্যা থাকে, তখন আমরা আউটপুট বিটটি 1 হিসাবে পেতে পারি।

XOR Operation

x=10;y=11 #find the value of x^y.
x=10 = 0000 1010
y=11 = 0000 1011{codeBox}

ছবিটি থেকে, যখন 1 এর বিজোড় সংখ্যা থাকে, আমরা আউটপুটে 1 পেতে পারি। সুতরাং, x^y= 0000 0001  (1 ডেসিমেল) ছাড়া কিছুই নয়।

বিটওয়াইজ লেফট শিফট অপারেটর (<<) {Bitwise Left Shift Operator (<<)}


এই অপারেটর সংখ্যার বিটগুলিকে একটি নির্দিষ্ট সংখ্যক অবস্থানের বাম দিকে স্থানান্তর করে। এই অপারেটরের প্রতীক হল <<। যদি আমরা x<<n লিখি, তার অর্থ হল x এর বিটগুলিকে বাম n অবস্থানের দিকে স্থানান্তর করা।

x=10 #calculate x value if we write x<<2{codeBox}

x এর মান বাম 2 পজিশনের দিকে স্থানান্তর করা হলে বামদিকের 2 বিট নষ্ট হয়ে যাবে। x এর মান 10=0000 1010। এখন, x<<2 হবে 0010 1000 =40 (ডেসিমাল)। এটি করার পদ্ধতিটি চিত্রে দেখানো হয়েছে। 

 
Shifting bits towards left 2 times

বিটওয়াইজ রাইট শিফট অপারেটর (>>) {Bitwise Right Shift Operator (>>)}

এই অপারেটর সংখ্যার বিটগুলিকে একটি নির্দিষ্ট সংখ্যক অবস্থানের ডানদিকে স্থানান্তরিত করে। এই অপারেটরের জন্য চিহ্ন হল >>, যদি আমরা x>>n লিখি, তাহলে মানে হল x এর বিটগুলিকে ডান n অবস্থানের দিকে স্থানান্তর করা।
>> বিটগুলিকে ডান দিকে স্থানান্তরিত করে এবং সাইন বিটটিও সংরক্ষণ করে, যা বামদিকের বিট। সাইন বিট সংখ্যার চিহ্নের প্রতিনিধিত্ব করে। সাইন বিট ( ) ইতিবাচক সংখ্যার প্রতিনিধিত্ব করে এবং 1 একটি ঋণাত্মক সংখ্যাকে উপস্থাপন করে।সুতরাং, একটি ধনাত্মক সংখ্যার উপর >> অপারেশন করার পরে, আমরা ফলাফলেও একটি ধনাত্মক মান পাই। যদি ডান স্থানান্তর একটি ঋণাত্মক সংখ্যার উপর করা হয়, আবার আমরা শুধুমাত্র একটি ঋণাত্মক মান পেতে পারি।

x=10 #Than calculate x>>2 value{codeBox}

x-এর মান ডান 2 অবস্থানের দিকে স্থানান্তরিত করলে ডানদিকের 2 বিট নষ্ট হয়ে যাবে। x মান হল 10 = 0000 1010। এখন x>>2 হবে: 0000 0010 =2 (ডেসিমাল নাম্বার)। 

Shifting bits towards right 2 times
 
এখন পর্যন্ত আলোচনা করা বিভিন্ন বিটওয়াইজ অপারেটরের প্রভাব পরীক্ষা করা যাক। আমরা IDLE উইন্ডো ব্যবহার করব এবং পাইথন স্টেটমেন্ট টাইপ করব এবং ফলাফল নিশ্চিত করব, যেমন নিচে দেখানো হয়েছে।

>>> x=10
>>> y=11
>>> print('~x=', ~x)
~x= -11
>>> print('x&y=', x&y)
x&y= 10
>>> print('x|y=', x|y)
x|y= 11
>>> print('x^y=', x^y)
x^y= 1
>>> print('x<<2=', x<<2)
x<<2= 40
>>> print('x>>2=', x>>2)
x>>2= 2
>>> {codeBox}
নবীনতর পূর্বতন