- 描述
-
直线上有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; }