我们先来了解一下XOR 运算法则:
a ^ a = 0
a ^ b = b ^ a;(交换律)
a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;(结合律)
c = a ^ b 可以推出 a = c ^ b
a ^ b ^ a = b
a ^ 0 = a
本题主要是,找出n ^ 0, n ^ 1 … n ^ m中未出现的最小非负整数
思路:
如果存在y,n ^ x = y,( 0 <= x <= m)
可以转化为 n ^ y = x,所以 n ^ y <= m,
即只要满足 n ^ k >= m + 1,k就是题中未出现的数,然后去找到其最小的
令 p = m + 1,所以只要找 n ^ k >= p
我们可以从高位往低位构造(ni,pi分别表示 n 和 p 的第i位)
- ni == pi,则 ki = 0, 保证 ni == pi,也可以达成n == p
- ni = 1, pi = 0, 则ki = 0,因为此时也满足n ^ k >= p
- ni = 0, pi = 1, 则ki必须等于1,因为如果这位比p小了,那么 后面一定 n ^ k < p
#include <iostream>
#include <cstdio>
using namespace std;
int n, m;
int main()
{
int T;
cin >> T;
while(T --)
{
cin >> n >> m;
if(n > m) puts("0");
else
{
int k = 0;
int p = m + 1;
for(int i = 30; i >= 0 ; i --)
{
int x = n >> i & 1;
int y = p >> i & 1;
if(x == y) continue;
if(y)
{
k ^= 1 << i;
}
if( (n ^ k) >= p) break;
}
cout << k << endl;
}
}
return 0;
}