标签:
根据题意,A和B的二进制1的个数相同,且要求距离最小,那么A和B的差别就在于相邻的bit位,如1100和1010,0011和0101等。
当A的最后一位(低位)为0,则找到最后(右边)一位1,然后将该1与左边的0交换,即得到B;如1100和1010
当A的最后一位(低位)为1,则找到最后(右边)一位0,然后将该0与右边的1交换,即得到B。如0011和0101
#include <iostream>
using namespace std;
int sameSumOfOne(int a){
if(a==0)
return 0;
int b=0;
int pos=0;
if((a&1)==0){
while(((a>>pos)&1)==0)
pos++;
b=a-(1<<pos)+(1<<(pos-1));
}
else{
while(((a>>pos)&1)==1)
pos++;
b=a-(1<<(pos-1))+(1<<pos);
}
return b;
}
int main()
{
int a[]={0,1,2,3,4,5,6,7,8,9,10};
int n=sizeof(a)/sizeof(a[0]);
for(int i=0;i<n;i++)
cout<<a[i]<<" "<<sameSumOfOne(a[i])<<endl;
cout<<endl;
return 0;
}

标签:
原文地址:http://www.cnblogs.com/AndyJee/p/4579086.html