প্রথমে বিট এবং বিটওয়াইজ অপারেটর সম্পর্কে সংক্ষেপে জানি।
বিট হচ্ছে বাইনারি ডিজিট। এটি কম্পিউটারের জন্য বুঝতে পারা ডেটার সবচেয়ে ছোট একক। এর মান শুধু দুটি হতে পারে 0 (OFF বোঝায়) এবং 1 (ON বোঝায়)।
বিটওয়াইজ অপারেটর হলো প্রোগ্রামে বিট লেভেলে কাজ करने वाले অপারেটর। এগুলো প্রোগ্রামে বিট ম্যানিপুলেট করতে ব্যবহৃত হয়।
C-তে ৬টি বিটওয়াইজ অপারেটর আছে −
বিটওয়াইজ AND (&)
বিটওয়াইজ OR (|)
বিটওয়াইজ XOR (^)
বিটওয়াইজ লेफট শিফট (<<)
বিটওয়াইজ রাইট শিফট (>>)
বিটওয়াইজ NOT (~)
https://www.tutorialspoint.com/cprogramming/c_bitwise_operators.htm
এখন, কিছু গুরুত্বপূর্ণ تاکটিকস বা কৌশল শিখি যা বিট নিয়ে কাজ করার সময় উপকারী।
দুই সংখ্যা সওয়াপ করা (বিটওয়াইজ XOR ব্যবহার করে)
আমরা বিটওয়াইজ XOR অপারেটর ব্যবহার করে দুটি মান সওয়াপ করতে পারি। ইমপ্লিমেন্টেশন −
উদাহরণ
#include <stdio.h>
int main(){
int x = 41;
int y = 90;
printf("Values before swapping! \n");
printf("x = %d \t", x);
printf("y = %d \n", y);
x = x ^ y;
y = y ^ x;
x = x ^ y;
printf("Values after swapping! \n");
printf("x = %d \t", x);
printf("y = %d \n", y);
return 0;
}আউটপুট
Values before swapping! x = 41 y = 90 Values before swapping! x = 90 y = 41
MSB (মোস্ট সিগনিফিক্যান্ট বিট) বের করার দক্ষ পদ্ধতি
যেকোনো পূর্ণসংখ্যার জন্য, আমরা সবচেয়ে গুরুত্বপূর্ণ বিট খুব দক্ষতার সাথে বের করতে পারি। এটি OR অপারেটর এবং বিটওয়াইজ শিফট অপারেটর ব্যবহার করে করা হয়। এই পদ্ধতিতে MSB O(1) টাইম কমপ্লেক্সিটিতে বের করা যায়।
ইন্টিজারের আকার প্রিডিফাইনড থাকতে হবে প্রোগ্রাম তৈরির জন্য।
উদাহরণ
৩২-বিট ইন্টিজারের MSB বের করার প্রোগ্রাম −
#include <stdio.h>
int findMSB(int x){
x |= x>>1;
x |= x>>2;
x |= x>>4;
x |= x>>8;
x |= x>>16;
x = x+1;
return(x >> 1);
}
int main(){
int x = 49;
printf("The number is %d\n", x);
int msb = findMSB(x);
printf("MSB of the number is %d\n", msb);
}আউটপুট
The number is 49 MSB of the number is 32
১ থেকে n পর্যন্ত সব সংখ্যার XOR সরাসরি ক্যালকুলেট করা
যদি আমরা ০ থেকে n-এর XORschech evoluciónosamente পর্যবেক্ষণ করি, একটি সাধারণ প্যাটার্ন বের করতে পারি। যা এখানে চিত্রিত −
উদাহরণ
#include <stdio.h>
// ১ থেকে n পর্যন্ত সব সংখ্যার সরাসরি XOR
int findXORuptoN(int n){
switch( n%4){
case 0: return n;
case 1: return 1;
break;
case 2: return n+1;
break;
case 3: return 0;
break;
default: break;
}
}
int main(){
int n = 9870;
int xorupton = findXORuptoN(n);
printf("XOR of all number up to %d is %d\n", n, xorupton);
}আউটপুট
XOR of all number up to 9870 is 9871
যেসব সংখ্যার যোগফল এবং XOR সমান, তাদের কম্বিনেশন সংখ্যা সরাসরি ক্যালকুলেট করা
বিটওয়াইজ শিফট অপারেটর ব্যবহার করে আমরা সহজেই কাজটি করতে পারি এবং এটি কম সময় নেবে।
উদাহরণ
#include <stdio.h>
int countValues(int n){
int unset=0;
while (n){
if ((n & 1) == 0)
unset++;
n=n>>1;
}
return (1<<unset);
}
int main(){
int n = 32;
printf("%d", countValues(n));
}আউটপুট
32
একটি ইন্টিজারের লিডিং এবং ট্রেইলিং ০-এর সংখ্যা বের করা
বিট ম্যানিপুলেশনের সুবিধায় ইন্টিজারের লিডিং এবং ট্রেইলিং শূন্যের সংখ্যা বের করার ইনবিল্ট মেথড আছে।
* এটি GCC ইনবিল্ট ফাংশন
উদাহরণ
#include <stdio.h>
int main(){
int n = 32;
printf("The integer value is %d\n", n);
printf("Number of leading zeros is %d\n", __builtin_clz(n));
printf("Number of trailing zeros is %d\n",__builtin_clz(n));
}আউটপুট
The integer value is 32 Number of leading zeros is 26 Number of trailing zeros is 26
চেক করা একটি সংখ্যা ২-এর ঘাত কিনা?
একটি সংখ্যা ২-এর ঘাত কিনা চেক করা বিটওয়াইজ অপারেটর দিয়ে সহজ হয়ে গেছে।
উদাহরণ
#include <stdio.h>
int isPowerof2(int n){
return n && (!(n&(n-1)));
}
int main(){
int n = 22;
if(isPowerof2(n))
printf("%d is a power of 2", n);
else
printf("%d is not a power of 2", n);
}আউটপুট
22 is not a power of 2
একটি সেটের সব সাবসেটের XOR বের করা
এটি করতে পারি এই ফ্যাক্ট ব্যবহার করে যে যদি ১-র চেয়ে বেশি এলিমেন্ট থাকে তবে সব সাবসেটের XOR সবসময় ০ হবে এবং ১ এলিমেন্ট থাকলে সেই নম্বরটিই হবে।
উদাহরণ
#include <stdio.h>
int findsubsetXOR (int set[], int size){
if (size == 1){
return set[size - 1];
}
else
return 0;
}
int main (){
int set[] = { 45, 12 };
int size = sizeof (set) / sizeof (set[0]);
printf ("The XOR of all subsets of set of size %d is %d\n", size, findsubsetXOR (set, size));
int set2[] = { 65 };
size = sizeof (set2) / sizeof (set2[0]);
printf ("The XOR of all subsets of set of size %d is %d\n", size, findsubsetXOR (set2, size));
}আউটপুট
The XOR of all subsets of set of size 2 is 0 The XOR of all subsets of set of size 1 is 65
দেওয়া বাইনারি নম্বরকে ইন্টিজারে রূপান্তর করা
C-তে auto কীওয়ার্ড ব্যবহার করে এই কাজটি করা যায়।
উদাহরণ
#include <stdio.h>
int main (){
auto integer = 0b0110110;
printf("The integer conversion of binary number '0110110' is %d", integer);
}আউটপুট
The integer conversion of binary number '0110110' is 54
একটি নম্বরের সব বিট ফ্লিপ করা
একটি নম্বর থেকে সব বিট সেট করা একটি নম্বর বিয়োগ করে আমরা সব বিট ফ্লিপ করতে পারি।
Number = 0110100 The number will all bits set = 1111111 Subtraction -> 1111111 - 0110100 = 1001011 (flipped bits number)
উদাহরণ
#include <stdio.h>
int main (){
int number = 23;
int n = number;
n |= n>>1;
n |= n>>2;
n |= n>>4;
n |= n>>8;
n |= n>>16;
printf("The number is %d\n", number);
printf("Number with reversed bits %d\n", n-number);
}আউটপুট
The number is 23 Number with reversed bits 8
বিটগুলোর অল্টারনেট প্যাটার্ন আছে কিনা চেক করা
বিটওয়াইজ XOR অপারেশন ব্যবহার করে আমরা একটি নম্বরের বিটগুলো অল্টারনেট প্যাটার্নে আছে কিনা তা বের করতে পারি। নিচের কোডটি দেখাচ্ছে কীভাবে −
উদাহরণ
#include <stdio.h>
int checkbitpattern(int n){
int result = n^(n>>1);
if(((n+1)&n) == 0)
return 1;
else
return 0;
}
int main (){
int number = 4;
if(checkbitpattern == 1){
printf("Bits of %d are in alternate pattern", number);
}
else
printf("Bits of %d are not in alternate pattern", number);
}আউটপুট
Bits of 4 are not in alternate pattern