显然是位操作题
做得有点没效率
考虑三种情况:
- 从低位读起,第一个读到的1后是0(例*0010*,则处理后为*0100*)
- 从低位读起,读到一串1,分两种情况,a。最低位为1(例*0111,处理后为*1011);b。最低位为0(例*001110,处理后为*010011)
#include<stdio.h>
#include<string.h>
int main()
{
int i,t;
long n,temp,bite[25],num[25]={0,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304};
while(scanf("%ld",&n)!=EOF,n)
{
memset(bite,0,sizeof(bite));
for(i=1;i<25;i++)
bite[i]=n&num[i];
for(i=1;;i++)
if(bite[i]) //读到1
{
t=i-1;
if(bite[i+1])
{
for(i=i+1;;i++) //2
if(!bite[i])
{
n=n&(~num[i-1]);
n=n|num[i];
break;
}
if(t) //t>0,则情况2.b
{
temp=n;
temp=temp>>t;
temp=temp&(~(~0<<(i-2-t)));
n=n&(~0<<(i-2));
n=n+temp;
}
}
else if(!bite[i+1]) //情况1
{
n=n&(~num[i]);
n=n|num[i+1];
}
break;
}
printf("%ld\n",n);
}
return 0;
}
不过别人还有简短的代码:
#include <stdio.h> int main() { int n,x; while(scanf("%d",&n),n) { x=n&-n; printf("%d\n",n+x+(n^n+x)/x/4); } }