কম্পিউটার

C++ এ বিট ম্যানিপুলেশন (গুরুত্বপূর্ণ কৌশল)


আসুন প্রথমে বিট সম্পর্কে স্মরণ করি এবং বিটওয়াইজ অপারেটরটি ছোট।

বিট একটি বাইনারি ডিজিট। এটি ডেটার ক্ষুদ্রতম একক যা কম্পিউটার দ্বারা বোধগম্য। ইন-এ দুটি মানের মধ্যে শুধুমাত্র একটি থাকতে পারে 0 (অফ বোঝায়) এবং 1 (চালু বোঝায়) .

বিটওয়াইজ অপারেটর৷ অপারেটর যারা প্রোগ্রামে কিছুটা লেভেলে কাজ করে।

এই অপারেটরগুলি প্রোগ্রামে বিটগুলি পরিচালনা করতে ব্যবহৃত হয়।

সি-তে, আমাদের 6টি বিটওয়াইজ অপারেটর আছে -

  • বিটওয়াইজ এবং (&)

  • বিটওয়াইজ বা (বা)

  • বিটওয়াইজ XOR (XOR)

  • বিটওয়াইসে বাম শিফট (<<)/p>

  • বিটওয়াইজ ডান শিফট (>>)

  • বিটওয়াইসে নয় (~)

https://www.tutorialspoint.com/cprogramming/c_bitwise_operators.htm

এখন, আসুন কিছু গুরুত্বপূর্ণ কৌশল শিখি যেমন জিনিসগুলি যেগুলি সাহায্য করতে পারে যদি আপনি বিটগুলির সাথে কাজ করেন৷

দুটি নম্বর অদলবদল করুন (বিটওয়াইজ XOR ব্যবহার করে)

আমরা bitwise 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

এমএসবি (সবচেয়ে উল্লেখযোগ্য বিট) খুঁজে পাওয়ার কার্যকর উপায়

যেকোনো পূর্ণসংখ্যা মানের জন্য, আমরা সবচেয়ে গুরুত্বপূর্ণ বিট খুঁজে পেতে পারি একটি কার্যকর উপায়। এটি একটি বিটওয়াইজ শিফট অপারেটর সহ বা অপারেটর ব্যবহার করে করা হয়। এই পদ্ধতিটি o(1) সময়ের জটিলতায় MSB খুঁজে পেতে পারে।

প্রোগ্রাম তৈরি করতে পূর্ণসংখ্যার আকার পূর্বনির্ধারিত হওয়া উচিত।

উদাহরণ

32-বিট পূর্ণসংখ্যার 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

সরাসরি 1 থেকে n পর্যন্ত সমস্ত সংখ্যার XOR গণনা করুন।

যদি আমরা 0 থেকে n এর XOR কে সাবধানে পর্যবেক্ষণ করি তাহলে আমরা একটি সাধারণ প্যাটার্ন বের করতে পারি। যা এখানে চিত্রিত করা হয়েছে −

উদাহরণ

#include <stdio.h>
// Direct XOR of all numbers from 1 to n
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

একটি পূর্ণসংখ্যার মধ্যে 0 এর অগ্রগামী এবং পিছনের সংখ্যা খুঁজে বের করা

বিট ম্যানিপুলেশনের জন্য ধন্যবাদ, একটি পূর্ণসংখ্যার অগ্রবর্তী এবং পরবর্তী শূন্যের সংখ্যা খুঁজে বের করার জন্য অন্তর্নির্মিত পদ্ধতি রয়েছে৷

* এটি একটি 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

একটি সংখ্যা দুটির শক্তি কিনা তা পরীক্ষা করুন?

পরীক্ষা করার জন্য, একটি সংখ্যা 2 এর পাওয়ার হলে, একটি বিটওয়াইজ অপারেটর ব্যবহার করে সহজ করা হয়।

উদাহরণ

#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 খুঁজুন

এটি ব্যবহার করে করা যেতে পারে যে যদি 1টির বেশি উপাদান থাকে তবে সমস্ত উপসেটের XOR সর্বদা 0 এবং অন্যথায় সংখ্যা।

উদাহরণ

#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

প্রদত্ত বাইনারি সংখ্যার পূর্ণসংখ্যা রূপান্তর করতে

স্বয়ংক্রিয় কাজটি করার জন্য সি-তে কীওয়ার্ড ব্যবহার করা হয়।

উদাহরণ

#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 (number with flipped bits)

উদাহরণ

#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

  1. C++ এ ডায়াগোনাল ট্রাভার্স II

  2. C++ এ কিল প্রসেস

  3. C++ এ কাঠবিড়ালি সিমুলেশন

  4. C++ এ আয়তক্ষেত্র ক্ষেত্র II