给定 x, k ,求满足 x + y = x | y 的第 k 小的正整数 y 。 | 是二进制的或(or)运算,例如 3 | 5 = 7。
比如当 x=5,k=1时返回 2,因为5+1=6 不等于 5|1=5,而 5+2=7 等于 5 | 2 = 7。
#include "stdafx.h"
#include<iostream>
#include<vector>
using namespace std;
void num2bit(unsigned long long n, vector<unsigned long long>&aa)
{
while (n != 0)
{
aa.push_back(n % 2);
n /= 2;
}
}
unsigned long long bit2num(vector<unsigned long long>aa, int end)
{
unsigned long long n = 0;
for (int i = 0; i != end; i++)
n += (aa[i] << i);
return n;
}
void patch(vector<unsigned long long>&aa)
{
for (int i = 0; i<aa.size(); i++)
aa[i] = aa[i] == 0 ? 1 : 0;
}
int main()
{
unsigned long long x(0), k(0);
while (cin >> x >> k)
{
vector<unsigned long long>aa, bb;
num2bit(x, aa);
bb = aa;
patch(bb);
aa = bb;
int cnt = 0, i = 0;
for (i = 0; i<bb.size(); i++)
{
if (bb[i] == 1)
cnt++;
}
if (((1 << cnt) - 1) >= k)
{
vector<unsigned long long>pp;
num2bit(k, pp);
int cc = 0;
for (i = 0; i<bb.size(); i++)
{
if (bb[i] == 1)
{
bb[i] = pp[cc];
cc++;
if (cc == pp.size())
break;
}
}
cout<<bit2num(bb, i+1)<<endl;
}
else
{
bb = aa;
vector<unsigned long long>off;
num2bit(k, off);
int cc = 0;
for (i = 0; i<bb.size(); i++)
{
if (bb[i] == 1)
{
bb[i] = off[cc];
cc++;
}
}
for (int j = cnt; j<off.size(); j++)
bb.push_back(off[j]);
cout << bit2num(bb, bb.size())<<endl;
}
}
return 0;
}