সি প্রোগ্রামিং বিটিওয়াজ অপারেটর
এই অধ্যায়ে আপনি সি প্রোগ্রামিং এ সকল বিটিওয়াজ অপারেটর(Bitwise Operator) সম্বন্ধে জানবেন
সেন্ট্রাল প্রোসেসিং ইউনিট(CPU) এর মধ্যে এরেথম্যাটিক লজিক ইউনিট(ALU) এ সকল গাণিতিক ক্রিয়াকলাপ যেমন- যোগ-বিয়োগ, গুণ-ভাগ ইত্যাদি বিট-লেভেলে সম্পন্ন হয়। এই বিট-লেভেল(bit-level) অপারেশন সম্পন্ন করার কাজেই বিটওয়াইজ অপারেটর ব্যবহৃত হয়।
সি প্রোগ্রামিং বিটয়াইজ অপারেটর-সমূহ
মনেকরি, নিচের টেবিলে x = 10 (বাইনারিতে 0000 1010) এবং y = 4 (বাইনারিতে 0000 0100)অপারেটর | অপারেটরের অর্থ | উদাহরণ(x=10 এবং y=4) | ফলাফল |
---|---|---|---|
& | Bitwise AND | x& y = 0 (0000 0000) | 0 |
| | Bitwise OR | x | y = 14 (0000 1110) | 14 |
^ | Bitwise exclusive OR | x ^ y = 14 (0000 1110) | 14 |
~ | Bitwise complement | ~x = -11 (1111 0101) | -11 |
<< | Shift left | x<< 2 = 42 (0010 1000) | 42 |
>> | Shift right | x>> 2 = 2 (0000 0010) | 2 |
বিটওয়াইজ AND(&) অপারেটর
বিটওয়াইজ অপারেটরের দুটি অপারেন্ডের বিট যদি 1 হয় তাহলে বিটওয়াইজ AND অপারেটর এর আউটপুট 1 হবে।
কিন্তু যদি বিটওয়াইজ অপারেটর এর যেকোনো একটি অপারেন্ড 0(শূন্য) হয় তাহলে আউটপুট 0(শূন্য) হবে।
বিটওয়াইজ AND(&) অপারেটর এর গাণিতিক ব্যাখ্যা
10 = 0000 1010 (বাইনারিতে) 4 = 0000 0100 (বাইনারিতে) 10 এবং 4 এর বিট অপারেশন 0000 1010 & 0000 0100 ________ 0000 0000 = 0 (দশকমিকে)
উদাহরনঃ সি প্রোগ্রামে বিটওয়াইজ AND অপারেটরের ব্যবহার
#include <stdio.h>
int main()
{
int a = 10, b = 4;
printf("Output of AND Operator= %d", a&b);
return 0;
}
আউটপুট
Output = 0
বিটওয়াইজ OR(|) অপারেটর
বিটওয়াইজ অপারেটরের দুটি অপারেন্ডের যেকোনো একটির বিট যদি 1 হয় তাহলে বিটওয়াইজ OR অপারেটর এর আউটপুট 1 হবে।
কিন্তু যদি বিটওয়াইজ অপারেটর এর দুটি অপারেন্ড-ই 0(শূন্য) হয় তাহলে আউটপুট 0(শূন্য) হবে। সি প্রোগ্রামিং এ | কে বিটওয়াইজ OR অপারেটর বলা হয়।
বিটওয়াইজ OR(|) অপারেটর এর গাণিতিক ব্যাখ্যা
10 = 0000 1010 (বাইনারিতে) 4 = 0000 0100 (বাইনারিতে) 10 এবং 4 এর বিট অপারেশন 0000 1010 | 0000 0100 ________ 0000 1110 = 14 (দশকমিকে)
উদাহরনঃ সি প্রোগ্রামে বিটওয়াইজ OR(|) অপারেটর এর ব্যবহার।
#include <stdio.h>
int main()
{
int a = 10, b = 4;
printf("Output of OR Operator = %d", a|b);
return 0;
}
আউটপুট
Output = 14
বিটওয়াইজ XOR(^) অপারেটর
XOR এর পূর্ণরুপ হলো exclusive OR । বিটওয়াইজ অপারেটর এর দুটি অপারেন্ড যদি পরস্পর বিপরীত হয় তাহলে বিটওয়াইজ XOR অপারেটর এর আউটপুট 1 হবে।
কিন্তু যদি বিটওয়াইজ অপারেটর এর দুটি অপারেন্ড-ই একই রকম হয় তাহলে আউটপুট 0(শূন্য) হবে। সি প্রোগ্রামিং এ ^ কে বিটওয়াইজ XOR অপারেটর বলা হয়।
বিটওয়াইজ XOR অপারেটর গাণিতিক ব্যাখ্যা
10 = 0000 1010 (বাইনারিতে) 4 = 0000 0100 (বাইনারিতে) 10 এবং 4 এর বিট অপারেশন 0000 1010 ^ 0000 0100 ________ 0000 1110 = 14 (দশকমিকে)
উদাহরনঃ সি প্রোগ্রামে বিটওয়াইজ XOR(^) অপারেটর এর ব্যবহার
#include <stdio.h>
int main()
{
int a = 10, b = 4;
printf("Output = %d", a^b);
return 0;
}
আউটপুট
Output = 14
বিটওয়াইজ পূরক(~) অপারেটর
বিটওয়াইজ পূরক(compliment) অপারেটর হলো উনারী(unary) অপারেটর যা কেবল মাত্র একটি অপারেন্ডের উপর কাজ করে। ইহা 1 কে পরিবর্তন করে 0 করে এবং 0 কে পরিবর্তন করে 1 করে। ইহাকে ~ এর মাধ্যমে চিহ্নিত করা হয়।
10 = 0000 1010 (বাইনারিতে) 10 এর বিটওয়াইজ পূরক অপারেটর ~ 0000 1010 ________ 1111 0101 = 245 (দশমিকে)
10 এর বিটওয়াইজ কমপ্লিমেন্ট 245 এর পরিবর্তে -11 হয়েছে। কিন্তু কেন?
কারণ যেকোনো পূর্ণসংখ্যা n এর জন্য বিটিওয়াইজ কমপ্লিমেন্ট -(n+1)
হবে। ইহা বুঝার জন্য আপনাকে প্রথমে 2'স কমপ্লিমেন্ট(Two's complement) সম্মন্ধে জানতে হবে।
2's Complement
বাইনারি সংখ্যায় 2's complement অপারেটর ব্যবহৃত হয়। একটি সংখ্যার 2's complement হলো ঐ সংখ্যার পূরকের সাথে ১ যোগ করলে যা হয় তার সমান। উদাহরনস্বরুপঃ
দশমিক বাইনারি 1's comliment 2's কমপ্লিমেন্ট 0 0000 0000 1111 1111 -(1111 1111+1) = -0000 0000 = -0(দশমিকে) 1 0000 0001 1111 1110 -(1111 1110+1) = -1111 1111 = -255((দশমিকে)) 245 1111 0101 0000 1010 -(0000 1010+1) = -1111 0101 = -11(দশমিকে)
নোটঃ 2'স কমপ্লিমেন্ট এর ক্ষেত্রে হাতের অঙ্ককে অবজ্ঞা করা হয়। অর্থাৎ ১ যোগ করার পরে শেষ অংকে অবশিষ্ট থাকলে তাকে হিসাবের বাইরে রাখা হয়।
10 এর বিটওয়াইজ কমপ্লিমেন্ট 245 এর পরিবর্তে -11 হয়েছে। কারণ 10 এর বিটওয়াইজ কমপ্লিমেন্ট হলো 245 (দশমিকে)। আবার 245 এর 2's complement হলো -11, সুতরাং 245 এর পরিবর্তে -11 আউটপুট হয়েছে।
যেকোনো সংখ্যা N এর বিটওয়াইজ কমপ্লিমেন্ট হলো -(N+1)
N এর bitwise complement = ~N (N এর 2's complement ফর্মে) এবং ~N এর 2'complement = -(~(~N)+1) = -(N+1)
উদাহরণঃ সি প্রোগ্রামে বিটওয়াইজ complement(~) অপারেটর এর ব্যবহার
#include <stdio.h>
int main()
{
printf("complement = %d\n",~10);
printf("complement = %d\n",~-20);
return 0;
}
Output
complement = -11 Output = 19
বিটওয়াইজ Left Shift( <<) অপারেটর
Left shift অপারেটর সমস্ত বিটকে নির্দিষ্ট সংখ্যক বিট বামে সরিয়ে দেয়। ইহাকে << এর মাধ্যমে প্রকাশ করা হয়।
200 = 11010100 (বাইনারিতে) 200<<1 = 1100100000 (বাইনারিতে এবং এক বিট দ্বারা Left shift হয়েছে। ) 200<<0 =11010100 (0 বিট দ্বারা Left Shift হয়েছে। ) 200<<2 = 1100100000 (বাইনারিতে) =800(দশমিকে) 200<<3 = 11001000000 (bainarite) =1600(দশমিকে)
উদাহরনঃ সি প্রোগ্রামে লেফট শিফট(Left Shift) অপারেটর এর ব্যবহার
#include <stdio.h>
int main()
{
int num=200, i;
for (i=0; i<=2; ++i)
printf("Left shift by %d: %d\n", i, num<<i);
return 0;
}
আউটপুট
Left Shift by 0: 200 Left Shift by 1: 400 Left Shift by 2: 800
বিটওয়াইজ Right Shift(>>) অপারেটর
Right shift অপারেটর সমস্ত বিটকে নির্দিষ্ট সংখ্যক বিট ডানে সরিয়ে দেয়। ইহাকে >> এর মাধ্যমে প্রকাশ করা হয়।
200 = 11001000 (বাইনারিতে) 200>>1 = 01100100 (বাইনারিতে এবং 1 বিট দ্বারা Right shift হয়েছে।) 200>>0 = 11010100 (কোনো শিফট হয়নি) 200>>2 = 00110010 (বাইনারিতে) = 50(দশমিকে) 200>>3 = 00011001 (বাইনারিতে) = 25(দশমিকে)
উদাহরনঃ সি প্রোগ্রামে লেফট শিফট(Left Shift) অপারেটর এর ব্যবহার
#include <stdio.h>
int main()
{
int num=200, i;
for (i=0; i<=2; ++i)
printf("Right shift by %d: %d\n", i, num>>i);
return 0;
}
আউটপুট
Right Shift by 0: 200 Right Shift by 1: 100 Right Shift by 2: 50