位操作法:比如说我们要找x = 5,k = {1,2,3,4}相对应的y的值。当k = 1时,y = 2,当k = 2时,y = 8,当k = 3 时,y = 10,当k = 4 时,y = 16。假设每个数最多有8位,我们找其中的规律。如下图所示:
通过上图我们可以看出,在x的二进制表示中,如果某一位的二进制是1,那么在y的二进制表示中对应的该位一定是0,比如说x = 5,第一位和第三位二进制形式中都是1,那么y的第一位和第三位必须都是0。y的其他位可以是0也可以是1,这就相当于对x的二进制中0对应的位进行全排列。代码如下:
-
#include<iostream>
-
using namespace std;
-
-
long long theNum(int x, int k)
-
{
-
long long tmp = x;
-
-
long long index1 = 1;
-
-
long long index2 = 1;
-
-
while (index2 <= k)
-
{
-
-
if ((index1 & tmp) == 0)
-
{
-
-
if (index2 & k)
-
{
-
tmp = tmp | index1;
-
}
-
-
index2 <<= 1;
-
}
-
-
index1 <<= 1;
-
}
-
return (tmp - x);
-
}
-
-
int main(void)
-
{
-
int x, k;
-
while (cin >> x >> k)
-
{
-
cout << theNum(x, k) << endl;
-
}
-
return 0;
-
}