给定两个十进制正整数A和B,请计算出A和B用二进制表示时有多少位是不同的。
例如,“3”的二进制表示为“11”,“9”的二进制表示为“1001”,“11”不足4位,不足部分实际上为0,即“0011”,因此二者从右至左第2、4位不同,所以3和9用二进制表示时有两位不同。
Input
输入包括两行,第1行是一个整数n,表示有n组测试数据。紧接着n行,每行包括两个十进制正整数A和B,A、B之间用空格隔开。
Output
输出有n行,为每组测试数据中A和B用二进制表示时不相同的位数。
Sample Input
1
3 9
Sample Output
2
#include<stdio.h>
#define N 1000
int a[N],b[N];
int main()
{
int t;
scanf("%d",&t);
while(t--){
//flag用来存储有多少位不同
int large,small;
int flag=0,i=0,j=0;
scanf("%d%d",&large,&small);
if(small>large) {
int t;t=small;small=large;large=t;
}
//用数组a来存储小的那个数的二进制
while(small){
a[i++]=small % 2 ;
small/=2;
}
//b来存储大的数的二进制
while(large){
b[j++]=large % 2 ;
large/=2;
}
int k=i;
//比较小的那个数的有效范围里面,有多少位不同
for(i=0;i<k;i++)
if(a[i]!=b[i]) flag++;
/*再超出小的数有效范围的数里,小的那个都是零,也就是说
只知道二进制那一位里是1就不同*/
for(i=k;i<j;i++)
if(b[i]==1) flag++;
printf("%d\n",flag);
}
}
这种方法是比较死板的,不灵活,可以使用位运算的骚操作。
/* Bailian3710 有多少位不同 */
#include <stdio.h>
int main(void)
{
int n, a, b, c, count;
scanf("%d", &n);
while(n--) {
scanf("%d%d", &a, &b);
c = a ^ b;
/*嗯,直接异或,判断有几个1就是不同*/
count = 0;
/*判断有几个1*/
while(c) {
if(c & 1)
count++;
c >>= 1;
}
printf("%d\n", count);
}
return 0;
}
OK,AC ,两种做法都能行,要是知道一些计算技巧就更简单了。