假设我们有3个正数a,b和c。我们必须找到进行a和b的某些位所需的最小翻转(a OR b == c)。在这里,我们正在考虑按位或运算。
翻转操作包括将任何单个位1更改为0或将其二进制表示中的位0更改为1。因此,如果a:0010和b:= 0110,则c为0101,翻转后,a为0001,b为0100
为了解决这个问题,我们将遵循以下步骤-
回答:= 0
当我在0到31的范围内
如果bitC为0
否则将ans增加1
如果bitA = 1且bitB = 1,则将ans加2,否则将ans加1
bitC:=(c / 2 ^ i)和1
bitA:=(a / 2 ^ i)和1
bitB:=(b / 2 ^ i)和1
如果(bitA或bitB)与bitC不同,则
返回ans
让我们看下面的实现以更好地理解-
#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