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

C++ में बिट मैनिपुलेशन (महत्वपूर्ण रणनीतियाँ)


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

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

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

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

  • बिटवाइज 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("स्वैपिंग से पहले मान! \n");
    printf("x = %d \t", x);
    printf("y = %d \n", y);
    x = x ^ y;
    y = y ^ x;
    x = x ^ y;
    printf("स्वैपिंग के बाद मान! \n");
    printf("x = %d \t", x);
    printf("y = %d \n", y);
    return 0;
}

आउटपुट

स्वैपिंग से पहले मान! x = 41 y = 90
स्वैपिंग के बाद मान! x = 90 y = 41

MSB (मोस्ट सिग्निफिकेंट बिट) खोजने का कुशल तरीका

किसी भी पूर्णांक मान के लिए, हम मोस्ट सिग्निफिकेंट बिट को कुशल तरीके से ढूंढ सकते हैं। यह OR ऑपरेटर के साथ बिटवाइज शिफ्ट ऑपरेटर का उपयोग करके किया जाता है। यह विधि 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("संख्या %d है\n", x);
    int msb = findMSB(x);
    printf("संख्या का MSB %d है\n", msb);
}

आउटपुट

संख्या 49 है
संख्या का MSB 32 है

1 से n तक सभी संख्याओं का XOR सीधे गणना करना

यदि हम 0 से n तक के XOR को ध्यान से देखें तो हम एक सामान्य पैटर्न प्राप्त कर सकते हैं। जिसे यहां दर्शाया गया है -

कार्यक्रम उदाहरण

#include <stdio.h>
// 1 से 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("%d तक सभी संख्याओं का XOR %d है\n", n, xorupton);
}

आउटपुट

9870 तक सभी संख्याओं का XOR 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("पूर्णांक मान %d है\n", n);
    printf("अग्रणी शून्य की संख्या %d है\n", __builtin_clz(n));
    printf("अनुगामी शून्य की संख्या %d है\n", __builtin_ctz(n));
}

आउटपुट

पूर्णांक मान 32 है
अग्रणी शून्य की संख्या 26 है
अनुगामी शून्य की संख्या 5 है

जांचें कि क्या संख्या 2 की घात है?

जांचने के लिए, यदि कोई संख्या 2 की घात है, तो बिटवाइज ऑपरेटर का उपयोग करके इसे आसान बनाया जाता है।

कार्यक्रम उदाहरण

#include <stdio.h>
int isPowerof2(int n){
    return n && (!(n&(n-1)));
}
int main(){
    int n = 22;
    if(isPowerof2(n))
        printf("%d 2 की घात है", n);
    else
        printf("%d 2 की घात नहीं है", n);
}

आउटपुट

22 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 ("आकार %d के समुच्चय के सभी उपसमुच्चयों का XOR %d है\n", size, findsubsetXOR (set, size));
    int set2[] = { 65 };
    size = sizeof (set2) / sizeof (set2[0]);
    printf ("आकार %d के समुच्चय के सभी उपसमुच्चयों का XOR %d है\n", size, findsubsetXOR (set2, size));
}

आउटपुट

आकार 2 के समुच्चय के सभी उपसमुच्चयों का XOR 0 है
आकार 1 के समुच्चय के सभी उपसमुच्चयों का XOR 65 है

दिए गए बाइनरी नंबर को पूर्णांक में बदलना

C में auto कीवर्ड का उपयोग कार्य करने के लिए किया जाता है।

कार्यक्रम उदाहरण

#include <stdio.h>
int main (){
    auto integer = 0b0110110;
    printf("बाइनरी नंबर '0110110' का पूर्णांक रूपांतरण %d है", integer);
}

आउटपुट

बाइनरी नंबर '0110110' का पूर्णांक रूपांतरण 54 है

एक संख्या के सभी बिट्स को फ्लिप करना

हम एक संख्या के सभी बिट्स को उस संख्या से घटाकर फ्लिप कर सकते हैं जिसके सभी बिट्स सेट हैं।

संख्या = 0110100
सभी बिट्स सेट वाली संख्या = 1111111
घटाव -> 1111111 - 0110100 = 1001011 (फ्लिप बिट्स वाली संख्या)

कार्यक्रम उदाहरण

#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("संख्या %d है\n", number);
    printf("उल्टे बिट्स वाली संख्या %d\n", n-number);
}

आउटपुट

संख्या 23 है
उल्टे बिट्स वाली संख्या 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("%d के बिट्स वैकल्पिक पैटर्न में हैं", number);
    }
    else
        printf("%d के बिट्स वैकल्पिक पैटर्न में नहीं हैं", number);
}

आउटपुट

4 के बिट्स वैकल्पिक पैटर्न में नहीं हैं
  1. C++ में प्रोसेस मारें C++ में प्रोसेस मारें

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

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

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

  1. C++ में आयत क्षेत्रफल II (Rectangle Area II) - ओवरलैपिंग आयतों का कुल क्षेत्रफल C++ में आयत क्षेत्रफल II (Rectangle Area II) - ओवरलैपिंग आयतों का कुल क्षेत्रफल

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