#include<stdio.h>
void printf_b(int n)//递归输出二进制序列
{
if(n==0)
{
return;
}
else
{
printf_b(n>>1);
printf("%d",n&1);
}
}
int main()
{
int a,p,v,i;
printf("输入整数:");
scanf("%d",&a);
printf("输入操作位:");
scanf("%d",&p);
printf("置0还是置1?");
scanf("%d",&v);
int a1=a,a2=a;//a的备份
int v1=v;//v的备份
if(p<32&&(v==0||v==1))
{
if(v==0)
{
for(i=1;i<=32;i++)
{
if(i!=33-p)//第p位为0,其余位为1
{
v=v<<1;
v=v^1;
}
else
{
v=v<<1;
}
}
a=a&v;
}
else
{
for(i=0;i<p-1;i++)//第p位为1,其余位为0
{
v=v<<1;
//printf("%d ",v);
}
a=a|v;
//printf("\n");
}
}
else
{
printf("输入有误!");
}
printf_b(a);
printf("\n");
return 0;
}
/*if(v==0)
{
for(i=0;i<p-1;i++)
{
v=v<<1;
v=v^1;
//printf("%d ",v);
a2=a2>>1;
}
a2=a2>>1; //获得高于p位的数
// printf("%d\n",a2);
a1=a1&v; //p及高于p的数清0
for(i=0;i<p;i++)//低p位清0
{
a2=a2<<1;
}
a=a2^a1;//与0异或,值不变;a1a2的第p位都为0,所以结果为0;其余位恢复;
printf("\n");
}*/
1.置0写了两种方法
2.//第一次尝试失败,单纯得以为第p次只要左移以为就可以了,然则不是
//第二次尝试失败,得到a1后,以为再与自身疑惑就可以了,然而没有考虑到异或后第p位也恢复了
//第三次,修改置0时,把a1,a2,定义的变量放在了给a初始化前面,导致a1,a2没有初值,这个要注意!