এটা খুবই কঠিন না, আপনি শুধু ছোট চিন্তা করতে হবে: অনুমান করা আমরা লিখছেন A
, B
এবং X
বাইনারি এবং Aᵢ
মান ডানদিকের 2 সংশ্লিষ্ট ⁱ বিট।
আমরা জানি যে: Aₒ ⊕ Xₒ = Bₒ + Xₒ
।
আসুন কীভাবে এটি মূল্যায়ন করতে হয় তা আবিষ্কার করতে একটি উদাহরণ ব্যবহার করুন: এ = 15 এবং বি = 6. বাইনারি রূপান্তর:
A = 1 1 1 1 B = 0 1 1 0
X = a b c d X = a b c d
এখন আমাদের কিছু সম্ভাবনা আছে। আসুন এ এবং বি এর ডানদিকের বিটগুলি বিশ্লেষণ করুন:
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 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
সুতরাং সন্তুষ্ট হওয়া কোনও এক্স খুঁজে পাওয়া সর্বদা সম্ভব হবে না A ⊕ X = B + X
, একটি মান কারণ নেই d
সন্তুষ্ট যে 1 + d = 0 + d
।
যাইহোক, যদি এক্স উপস্থিত থাকে, আপনি ঠিক এইভাবে এটি ডান থেকে বামে খুঁজে পেতে পারেন bit
কাজ সম্পূর্ণ উদাহরণ
এ = 15, বি = 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
এখানে, ডি = 0 এবং ডি = 1 উভয়ই প্রয়োগ করে, তবে কী? আমাদের পরবর্তী বিট পরীক্ষা করা উচিত। ধরুন ডি = 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)
সুতরাং এই ক্ষেত্রে, ডি 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
। কিছুটা সময়ের জন্য সেই সমতাটি নিয়ে ভাবার চেষ্টা করুন।