要把數字變成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);
}
}