Bitwise Balancing
题面翻译
位运算平衡
题目描述
给定三个非负整数 $ b $ 、$ c $ 和 $ d $ 。
请找到一个非负整数 $ a \in [0, 2^{61}] $ 使得 $ (a\, |\, b)-(a\, \&\, c)=d $ ,其中 $ | $ 和 $ \& $ 分别表示按位或运算和按位与运算。
如果存在这样的 $ a $ ,请输出它的值。如果没有解,请输出整数 $ -1 $ 。如果存在多个解,输出其中任意一个。
输入格式
每个测试包含多个测试用例。第一行包含测试用例的数量 $ t $ ( $ 1 \le t \le 10^5 $ )。每个测试用例的描述如下。
每个测试用例的唯一一行包含三个正整数 $ b $ 、$ c $ 和 $ d $ ( $ 0 \le b, c, d \le 10^{18} $ )。
输出格式
对于每个测试用例,输出 $ a $ 的值,或者如果没有解则输出 $ -1 $ 。请注意,$ a $ 必须是非负数,并且不能超过 $ 2^{61} $ 。
提示
在第一个测试用例中,$ (0\,|\,2)-(0\,\&\,2)=2-0=2 $ 。因此,$ a = 0 $ 是一个正确答案。
在第二个测试用例中,没有任何值 $ a $ 满足方程。
在第三个测试用例中,$ (12\,|\,10)-(12\,\&\,2)=14-0=14 $ 。因此,$ a = 12 $ 是一个正确答案。
题目描述
You are given three non-negative integers $ b $ , $ c $ , and $ d $ .
Please find a non-negative integer $ a \in [0, 2^{61}] $ such that $ (a\, |\, b)-(a\, \&\, c)=d $ , where $ | $ and $ \& $ denote the bitwise OR operation and the bitwise AND operation, respectively.
If such an $ a $ exists, print its value. If there is no solution, print a single integer $ -1 $ . If there are multiple solutions, print any of them.
输入格式
Each test contains multiple test cases. The first line contains the number of test cases $ t $ ( $ 1 \le t \le 10^5 $ ). The description of the test cases follows.
The only line of each test case contains three positive integers $ b $ , $ c $ , and $ d $ ( $ 0 \le b, c, d \le 10^{18} $ ).
输出格式
For each test case, output the value of $ a $ , or $ -1 $ if there is no solution. Please note that $ a $ must be non-negative and cannot exceed $ 2^{61} $ .
样例 #1
样例输入 #1
3
2 2 2
4 2 6
10 2 14
样例输出 #1
0
-1
12
提示
In the first test case, $ (0\,|\,2)-(0\,\&\,2)=2-0=2 $ . So, $ a = 0 $ is a correct answer.
In the second test case, no value of $ a $ satisfies the equation.
In the third test case, $ (12\,|\,10)-(12\,\&\,2)=14-0=14 $ . So, $ a = 12 $ is a correct answer.
知道a|b必然比a&c大,所以把他们三个转换成二进制,对于a来说,a|b之后,原来是1的必然还是1,原来是0的可能变成1,对于a&c来说,0还是0,1可能变成0,所以对每一位进行拆位,d在这一位是1的话,就是2的某次方,看看b和c在这一位的数字,再看看a在这一位要是1还是0才可以让d的这一位是1,如果不行,就“-1”
void solve()
{
int b, c, d;
cin >> b >> c >> d;
int a = b ^ d;//表得来的规律
if ((a | b) - (a & c) == d) cout << a << '\n';
else cout << "-1" << '\n';
}