2141 holes

描述

直线上有32个孔,一开始,有些孔被堵住(记为1),有些孔没有被堵住(记为0),很明显,这些孔的状态可以表示成一个长度为32的0,1串,
如果将这个0,1串看成是32位无符号整数的2进制表示的话,这个状态又可以表示成一个32位无符号整数N,这个整数的二进制表示就是这个0,1串。
现在进行以下操作,
每次操作将某些孔堵住(如果这个孔原来没有被堵住,现在会变成堵住;如果原来就已经堵住了,现在当然依然被堵住),而保持其他孔状态不变。
比如原来是00000000000000000000000000000011(相应的32位无符号整数N为3)
现在要把右边第1个、第3个孔和第5个孔堵住,那么进行这次操作后,
孔的状态就变成了00000000000000000000000000010111
这次的操作也可以用一个0,1串表示00000000000000000000000000010101 它的右起第k位为1表示要堵住第k个孔,为0表示不改变,
明显,这个操作对应的0,1串也可以表示为一个32位无符号整数M,此处M=21
现在的问题是,给出原来孔的状态N,以及将要进行的操作M,请输出操作后孔的状态(也用一个32位无符号整数表示)

输入

多组测试数据(不超过10000组),每组测试数据两个32位无符号整数,分别为N和M

输出

输出一个32位无符号整数,表示操作后孔的状态

样例输入
3 21
样例输出
23


进制转换简单水题

#include <stdio.h>
#include <math.h>

int main()
{
	int m;
	int n;
	int a[32],b[32];
	int up,up1;
	int i;
	double sum;

	while(scanf("%d %d",&n,&m)!=EOF)
	{
		up=up1=0;

		for(i=0;i<32;i++)
			a[i]=b[i]=0;



		while(m!=0)
		{
			a[up]=m%2;
			up++;
			m=m/2;

		}
		while(n!=0)
		{
			b[up1]=n%2;
			up1++;
			n=n/2;
		}
		sum=0;

		


		for(i=0;i<32;i++)
		{
			if(a[i]==1||b[i]==1)
			{
				sum+=pow(2,i);

			}

		}

 	printf("%.0lf\n",sum);

	}

	return 0;

}


你可能感兴趣的:(测试,UP)