//是按照自己的思路修改的, 与楼主的思路不同
#include
int main(void)
{
int x,p,n,s;
int i,j;
int mask_0,mask_1,bitCheck;
scanf("%d%d%d",&x,&p,&n);
//原来的代码 int mask;
//原来的代码 mask=(~(~0<//原来的代码 s=(~x & mask) | (x & ~mask);
s=x;
//负责置1 0x1=00000000 00000000 00000000 00000001
mask_1 = 0x1;
//负责置0 0xFFFFFFFE=11111111 11111111 11111111 11111110
mask_0 = ~mask_1;
for(i=0;i{
mask_1<<=1;
mask_0 = ~mask_1;
}
for(i=0;i{
bitCheck=s & mask_1;
if(bitCheck) //该位是"1"
{
s=s & mask_0;
}
else //该位是"0"
{
s=s | mask_1;
}
mask_1<<=1;
mask_0 = ~mask_1;
}
int m=1<<31; //原来的代码 int m=1<<(n-1);
for(i=1;i<=32;i++)
{
putchar(!(x&m)?'0':'1');
x<<=1;
if(!(i%8)&&i<32)
{
putchar(' ');
}
}
putchar('\n');
for(j=1;j<=32;j++)
{
putchar(!(s&m)?'0':'1');
s<<=1;
if(!(j%8)&&j<32)
{
putchar(' ');
}
}
return 0;
}
顶贴
编译器有bug,把左移n位当n为32的倍数时按不移动处理了。你可以把~0<