1、题目描述
给你三个正整数 a、b 和 c。
你可以对 a 和 b 的二进制表示进行位翻转操作,返回能够使按位或运算 a OR b == c 成立的最小翻转次数。
「位翻转操作」是指将一个数的二进制表示任何单个位上的 1 变成 0 或者 0 变成 1 。
提示:
1 <= a <= 10^9
1 <= b <= 10^9
1 <= c <= 10^9
2、示例
输入:a = 2, b = 6, c = 5
输出:3
解释:翻转后 a = 1 , b = 4 , c = 5 使得 a OR b == c
3、题解
基本思想:位运算,如果c当前位为1,a和b至少有一个当前位为1;如果c当前位为0,a和b当前位都为0。
class Solution {
public:
int minFlips(int a, int b, int c) {
int res=0;
for(int i=1;i<=32;i++)
{
if(c&1)
{
if(((a&1)==0)&&((b&1)==0))
res++;
}
else
{
if(a&1)
res++;
if(b&1)
res++;
}
a>>=1;
b>>=1;
c>>=1;
}
return res;
}
};