यह बहुत कठिन नहीं है, आपको बस छोटा सोचने की जरूरत है: मान लें कि हम लिख रहे हैं A
, B
और X
बाइनरी में और Aᵢ
सबसे सही 2 most बिट के अनुरूप मूल्य है ।
हम जानते हैं कि Aₒ ⊕ Xₒ = Bₒ + Xₒ
:।
आइए इसका मूल्यांकन करने के लिए एक उदाहरण का उपयोग करें: A = 15 और B = 6. बाइनरी में परिवर्तित करना:
A = 1 1 1 1 B = 0 1 1 0
X = a b c d X = a b c d
अब हमारे पास कुछ संभावनाएं हैं। आइए A और B के सबसे सही बिट्स का विश्लेषण करें:
1 ⊕ d = 0 + d
हम जानते हैं कि d
केवल 0 या 1 हो सकता है, इसलिए:
for d = 0
1 ⊕ d = 0 + d => 1 ⊕ 0 = 0 + 0 => 1 = 0 (not possible)
for d = 1
1 ⊕ d = 0 + d => 1 ⊕ 1 = 0 + 1 => 0 = 1 (not possible)
यह ध्यान देने योग्य है कि XOR द्विआधारी राशि की तरह व्यवहार करता है (इस अंतर के साथ कि XOR अगले बिट योग के लिए एक कैरीओवर नहीं बनाता है):
XOR SUM
0 ⊕ 0 = 0 | 0 + 0 = 0
0 ⊕ 1 = 1 | 0 + 1 = 1
1 ⊕ 0 = 1 | 1 + 0 = 1
1 ⊕ 1 = 0 | 1 + 1 = 0
इसलिए ऐसा X हमेशा खोजना संभव नहीं होगा जो संतुष्ट करता हो A ⊕ X = B + X
, क्योंकि कोई ऐसा मूल्य नहीं है d
जो संतुष्ट करता हो 1 + d = 0 + d
।
वैसे भी, यदि X मौजूद है, तो आप इसे केवल इस तरह से पता कर सकते हैं, दाएं से बाएं, थोड़ा-थोड़ा करके।
पूरा पूरा काम
A = 15, B = 7:
A = 1 1 1 1 B = 0 1 1 1
X = a b c d X = a b c d
1 ⊕ d = 1 + d
यहाँ, दोनों d = 0 और d = 1 लागू होते हैं, फिर क्या? हमें अगले बिट की जांच करने की आवश्यकता है। मान लीजिए d = 1:
A = 1 1 1 1 B = 0 1 1 1
X = a b c d X = a b c d
1 ⊕ d = 1 + d => 1 ⊕ 1 = 1 + 1 => 0 = 0 (possible)
BUT 1 + 1 = 0 generates a carryover for the next bit sum:
Instead of 1 ⊕ c = 1 + c, we have 1 ⊕ c = 1 + c (+1) =
1 ⊕ c = c (not possible)
तो इस मामले में, d 0 होना चाहिए।
carryover 0
A = 1 1 1 1 B = 0 1 1 1
X = a b 0 0 X = a b 0 0
-----------------------------------
0 0
we know that c must be 0:
carryover 0 0
A = 1 1 1 1 B = 0 1 1 1
X = a b 0 0 X = a b 0 0
-----------------------------------
1 1 1 1
लेकिन बी के बारे में क्या? हमें हमेशा की तरह अगले बिट की जांच करने की आवश्यकता है:
if b = 0, there won't be a carryover, so we'll have:
1 ⊕ a = 0 + a (and this is not possible)
so we try b = 1:
1 ⊕ b = 1 + b => 1 ⊕ 1 = 1 + 1 => 0 = 0 (with carryover)
और अब, के लिए a
:
carryover 1 0 0
A = 1 1 1 1 B = 0 1 1 1
X = a 1 0 0 X = a 1 0 0
-----------------------------------
0 0 0 0 0 0
1 ⊕ a = 0 + a (+1) => 1 ⊕ a = 1 + a
यहां a
0 और 1 हो सकते हैं, लेकिन यह राशि में कैरीओवर से बचने के लिए 0 होना चाहिए B + X
।
फिर, X = 0 1 0 0
इस प्रकार एक्स = 4।
कोड
#include <iostream>
using namespace std;
inline int bit(int a, int n) {
if(n > 31) return 0;
return (a & ( 1 << n )) >> n;
}
int main(){
int A = 19;
int B = 7;
int X = 0;
int carryover = 0;
int aCurrent, aNext, bCurrent, bNext;
for(int i = 0; i < 32; i++){
aCurrent = bit(A, i); bCurrent = bit(B, i);
aNext = bit(A, i + 1); bNext = bit(B, i + 1);
if(aCurrent == 0 && bCurrent == 0){
if(carryover) {X = -1; break;}
if(aNext != bNext){
X += 1 << i;
}
carryover = 0;
}
else if(aCurrent == 0 && bCurrent == 1){
if(!carryover) {X = -1; break;}
if(aNext == bNext){
X += 1 << i;
}
carryover = 1;
}
else if(aCurrent == 1 && bCurrent == 0){
if(!carryover) {X = -1; break;}
if(aNext != bNext){
X += 1 << i;
carryover = 1;
}
else {
carryover = 0;
}
}
else if(aCurrent == 1 && bCurrent == 1){
if(carryover) {X = -1; break;}
if(aNext != bNext){
X += 1 << i;
carryover = 1;
}
else {
carryover = 0;
}
}
}
if(X != -1) cout<<"X = "<<X<<endl;
else cout<<"X doesnt exist"<<endl;
return 0;
}
आप इसे यहाँ परीक्षण कर सकते हैं ।
a xor b = a + b mod 2
। थोड़ी देर के लिए उस समानता के बारे में सोचने की कोशिश करें।