在C ++中使OR b等于c的最小翻转

假设我们有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

    例子(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