位操作法:比如说我们要找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;
- }