इस समस्या में, हमें दो पूर्णांक मान a और b दिए गए हैं। और हमारा काम ए से बी तक की सीमा के बिटवाइज OR (|) को खोजना है। इसका अर्थ है कि हमें a का मान ज्ञात करना होगा। ए+1 | ए+2 | ... बी-1 | ख.
समस्या को समझने के लिए एक उदाहरण लेते हैं,
इनपुट - ए =3 , बी =8
आउटपुट − 15
स्पष्टीकरण - 3 | 4 | 5 | 6 | 7 | 8 =15
समस्या को हल करने के लिए, एक सरल समाधान है a से शुरू करना और बिट-वार या सभी संख्याओं में से एक को बढ़ाकर b करना।
अधिक प्रभावी समाधान,
यह एक अधिक प्रभावी उपाय है, इसका उपयोग करके किया जा सकता है -
चरण 1 - a और b दोनों के लिए MSB बिट खोजें, मान लें कि उन्हें MSBa और MSBb कहते हैं।
चरण 2 - जांचें कि एमएसबीए एमएसबीबी के बराबर है या नहीं।
चरण 2.1 - अगर एमएसबीए और एमएसबीबी बराबर हैं। करो,
चरण 2.1.1 - परिणामों के MSB को 1 के रूप में सेट करें।
चरण 2.1.2 - एमएसबी को ए और बी से घटाएं जो ए और बी के लिए नया मान होगा। चरण 1 पर जाएं।
चरण 2.2 - यदि एमएसबीए और एमएसबीबी बराबर हैं। करो,
चरण 2.2.1 - परिणाम के सभी बिट्स को 0 से अधिकतम (MSBa, MSBb) पर सेट करें।
चरण 3 - प्रिंट परिणाम।
अब, ऊपर दिए गए एल्गोरिथम को काम करते हुए देखते हैं -
उदाहरण - ए =3 और बी =8.
समाधान -
चरण1 - एमएसबीए =1; एमएसबीबी =3
चरण2 - MSBa !=MSBb, सभी बिट्स को बिट स्थिति 3 से बिट स्थिति 0 के परिणाम के 1 पर सेट करें। परिणाम =(1111)2 =15.
उदाहरण
अब, समस्या को हल करने के लिए कोड देखते हैं,
#include <iostream>
using namespace std;
int FindpositionMSB(long long int n){
int MSBval = -1;
while (n) {
n = n>>1;
MSBval++;
}
return MSBval;
}
long int CalcBitwiseORRaneg( long int a, long int b) {
long int result = 0;
int msba = FindpositionMSB(a);
int msbb = FindpositionMSB(b);
while (msba == msbb) {
long int value = (1 << msba);
result += value;
a -= value;
b -= value;
msba = FindpositionMSB(a);
msbb = FindpositionMSB(b);
}
msba = max(msba, msbb);
for (int i = msba; i >= 0; i--) {
long int res_val = (1<<i);
result += res_val;
}
return result;
}
int main() {
long int a = 3, b = 8;
cout<<"The bitwise OR (|) of all integers in the range from "<<a<<" to "<<b<<" is "<<CalcBitwiseORRaneg(a, b);
return 0;
} आउटपुट
The bitwise OR (|) of all integers in the range from 3 to 8 is 15