4.输入一个整数a,再输入整数p,v=0或1,将该整数a的p位设置为v,输出修改后的该整数的二进制表示.

#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没有初值,这个要注意!


 

猜你喜欢

转载自blog.csdn.net/phenomenon_ting/article/details/89044547
今日推荐