Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ में बिट्स हेरफेर (महत्वपूर्ण रणनीति)

आइए पहले बिट्स के बारे में याद करें और बिटवाइज़ ऑपरेटर छोटा है।

बिट एक द्विआधारी अंक है। यह डेटा की सबसे छोटी इकाई है जिसे कंप्यूटर द्वारा समझा जा सकता है। में दो में से केवल एक मान हो सकता है 0 (बंद को दर्शाता है) और 1 (चालू को दर्शाता है)

बिटवाइज ऑपरेटर वे ऑपरेटर हैं जो प्रोग्राम में थोड़ा स्तर पर काम करते हैं।

इन ऑपरेटरों का उपयोग प्रोग्राम में बिट्स में हेरफेर करने के लिए किया जाता है।

C में, हमारे पास 6 बिटवाइज़ ऑपरेटर हैं -

  • बिटवाइज़ और (&)

  • बिटवाइज़ OR (OR)

  • बिटवाइज़ XOR (XOR)

  • बिटवाइज़ लेफ्ट शिफ्ट (<<)/p>

  • बिटवाइज़ राइट शिफ्ट (>>)

  • बिटवाइज़ नहीं (~)

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 (सबसे महत्वपूर्ण बिट) खोजने का कुशल तरीका

किसी भी पूर्णांक मान के लिए, हम सबसे महत्वपूर्ण बिट एक प्रभावी तरीका पा सकते हैं। यह बिटवाइज़ शिफ्ट ऑपरेटर के साथ या ऑपरेटर का उपयोग करके किया जाता है। यह विधि MSB को o(1) समय जटिलता में ढूँढ सकती है।

प्रोग्राम बनाने के लिए पूर्णांक का आकार पूर्वनिर्धारित होना चाहिए।

उदाहरण

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. सी ++ में प्रक्रिया को मारें

    मान लीजिए कि हमारे पास n प्रक्रियाएं हैं, यहां प्रत्येक प्रक्रिया की एक विशिष्ट आईडी होती है जिसे PID या प्रक्रिया आईडी कहा जाता है और उसका PPID (पैरेंट प्रोसेस आईडी) भी होता है। प्रत्येक प्रक्रिया में केवल एक पैरेंट प्रक्रिया होती है, लेकिन इसमें एक या अधिक चाइल्ड प्रक्रियाएं हो सकती हैं। यह एक प

  1. सी ++ में गिलहरी सिमुलेशन

    एक पेड़, एक गिलहरी, और कई नट हैं। स्थितियों को 2डी ग्रिड में कोशिकाओं द्वारा दर्शाया जाता है। आपका लक्ष्य गिलहरी के लिए सभी नटों को इकट्ठा करने और उन्हें एक-एक करके पेड़ के नीचे रखने के लिए न्यूनतम दूरी का पता लगाना है। गिलहरी एक समय में केवल एक अखरोट ले सकती है और चार दिशाओं में - ऊपर, नीचे, बाएँ औ

  1. C++ में आयत क्षेत्र II

    मान लीजिए कि हमारे पास (अक्ष-संरेखित) आयतों की एक सूची है। यहाँ प्रत्येक आयत [i] ={x1, y1, x2, y2}, जहाँ (x1, y1) निचले-बाएँ कोने का बिंदु है, और (x2, y2) ऊपरी-दाएँ कोने के बिंदु हैं आयत। हमें समतल में सभी आयतों द्वारा कवर किया गया कुल क्षेत्रफल ज्ञात करना है। उत्तर बहुत हो सकता है, इसलिए हम मॉड्यू