题目描述
给你三个正整数 a、b 和 c。你可以对 a 和 b 的二进制表示进行位翻转操作,返回能够使按位或运算 a OR b == c 成立的最小翻转次数。「位翻转操作」是指将一个数的二进制表示任何单个位上的 1 变成 0 或者 0 变成 1 。
解析
这一题就按位依次比较就行了。取这个数二进制的第i个数的方式就是使用掩码,其他位都是0,第i位为1,且操作后如果是0说明第i位为0,否则是1。
public int minFlips(int a, int b, int c) {
if ((a | b) == c) {
return 0;
}
int res = 0;
for (int i = 0; i < 32; i++) {
int mask = 1 << i;
boolean bitA = (a & mask) != 0;
boolean bitB = (b & mask) != 0;
boolean bitC = (c & mask) != 0;
if (!bitA && !bitB && bitC) {
res++;
} else if (bitA && bitB && !bitC) {
res += 2;
} else if ((bitA || bitB) && !bitC) {
res++;
}
}
return res;
}