मान लीजिए कि हमारे पास 3 धनात्मक संख्याएँ a, b और c हैं। हमें (a OR b ==c ) बनाने के लिए a और b के कुछ बिट्स में आवश्यक न्यूनतम फ़्लिप खोजने होंगे। यहां हम बिटवाइज या ऑपरेशन पर विचार कर रहे हैं।
फ्लिप ऑपरेशन में किसी एक बिट को 1 से 0 में बदलना या बिट 0 से 1 को उनके बाइनरी प्रतिनिधित्व में बदलना शामिल है। तो अगर a :0010 और b :=0110, तो c 0101 है, फ़्लिप के बाद, a 0001 होगा, और b 0100 होगा
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- उत्तर:=0
- मैं के लिए 0 से 31 की सीमा में
- bitC :=(c / 2^i) और 1
- बिटा:=(ए / 2^i) और 1
- बिटबी:=(बी/2^i) और 1
- अगर (bitA या bitB) bitC के समान नहीं है, तो
- यदि बिटसी 0 है
- यदि बिटए =1 और बिटबी =1 है, तो उत्तर को 2 से बढ़ाएँ, अन्यथा उत्तर को 1 से बढ़ाएँ
- अन्यथा उत्तर को 1 से बढ़ाएं
- यदि बिटसी 0 है
- वापसी उत्तर
उदाहरण(C++)
आइए एक बेहतर समझ प्राप्त करने के लिए निम्नलिखित कार्यान्वयन देखें -
#include <bits/stdc++.h> using namespace std; class Solution { public: int minFlips(int a, int b, int c) { int ans = 0; for(int i = 0; i < 32; i++){ int bitC = (c >> i) & 1; int bitA = (a >> i) & 1; int bitB = (b >> i) & 1; if((bitA || bitB) != bitC){ if(!bitC){ if(bitA == 1 && bitB == 1){ ans += 2; } else { ans += 1; } } else{ ans += 1; } } } return ans; } }; main(){ Solution ob; cout << (ob.minFlips(2,6,5)); }
इनपुट
2 6 5
आउटपुट
3