要把数字变成1的个数相同,比这个数大的最少的一个数
我的想法就是先找到第一个01这样的序列,把1向前移动一位,然后再把位置靠前的1移动到后面的0上。
位操作:
&= 可以把某位置0 通过1110111这样子的数字
|= 可以把某位置1 通过0001000这样的数字
^ 异或,与11111异或可以取反 另外两个相同的数与另一个数异或得到另一个数 5^2^5=2
~ 按位取反
>>= 右移一位
<<= 左移一位
#include<stdio.h>
int main()
{
int cas;
scanf("%d",&cas);
for(int T=1;T<=cas;T++)
{
int n;
int tn;
scanf("%d",&n);
tn=n;
int a=2,b=1;
while(1)
{
if((a&n)==0&&(b&n)!=0)
{
n|=a;
n&=(~b);
break;
}
a<<=1;
b<<=1;
}
int c=b;
int d=1;
while(c>d)
{
while((n&c)==0&&(c>d))
c>>=1;
while((n&d)!=0&&(c>d))
d<<=1;
if(c>d)
{
n&=(~c);//c的1所在位置置0
n|=d;//d的1所在位置置1
c>>=1;
d<<=1;
}
}
printf("Case %d: %d\n",T,n);
}
}