最近,蒟蒻小明的班上准备拍一次特殊的集体照,因为队形要求是要班上的所有 32 名同学全部站成一排。而好学的小明发现,在这种情况下,如果将男女生分别看成 1 和 0,照相的队形就能组成一个 32 位长的二进制数,而二进制又能转化成十进制,因此一个不同的队形就对应了一个不同的数字。
小明想考一考他的同桌,就想出了一个问题:给定原始队形 x,问如何重新排列队伍,才能得到第一个在数值上比原始队形大的数 y 呢。但其实身为蒟蒻的小明自己也不知道答案,所以就把计算答案这个任务委托给了聪明的你,请你写一个程序帮帮孩子。
代码:(有些奇奇怪怪的东西)
#include<bits/stdc++.h>
using namespace std;
// #define fileio
#define IOS
void ___()
{
#ifdef fileio
freopen(".in","r",stdin);
freopen(".out","w",stdout);
#endif
#ifdef IOS
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define endl '\n'
#endif
}
#define ll long long
typedef unsigned int uint;
uint solve(uint x)
{
uint t=x,p=0,y=0;
bool f=0;
while(t)
{
if((t&1)==0)
{
if(f)
break;
}
else
f=1;
y&=((t&1)<<p);
p++;
t>>=1;
}
return (t<<p)&(y<<1);
}
int main()
{
___();
while(1)
{
uint x;
cin>>x;
if(!x)
break;
cout<<solve(x)<<endl;
}
return 0;
}