题目描述
世界上有10种人,一种懂二进制,一种不懂。那么你知道两个int32整数m和n的二进制表达,有多少个位(bit)不同么?
测试样例:
1999 2299
返回:7
程序代码
代码1:
#include <iostream>
using namespace std;
int coutBitDiff(int m,int n){
int x=m,y=n;
int s=0;
int tp1,tp2;
while(x>0||y>0){
if(x>0){
tp1=x%2;
x=x/2;
}else{
tp1=0;
}
if(y>0){
tp2=y%2;
y=y/2;
}else{
tp2=0;
}
if(tp1!=tp2){
s++;
}
}
return s;
}
int main(){
int s;
s=coutBitDiff(10,2);
cout<<s<<endl;
system("pause");
}
代码2:
#include <iostream>
using namespace std;
int coutBitDiff(int m,int n){
int count=0;
int val=m^n;
while(val)
{
count++;
val=val&(val-1);
}
return count;
}
int main(){
int s;
s=coutBitDiff(10,2);
cout<<s<<endl;
system("pause");
}
知识点:用位运算异或,两个数异或相同为0,不同为1。得到结果再去求1的个数。
比如:
9:1001
3:0011
二者异或得:
1010
一共有两个1,因此共有2个位不同。
求1的个数的方法:val=val&(val-1)
例如上面的10:1010,10&(10-1)=1010&1001=1000,因此式子val=val&(val-1)的作用就是把数值的二进制形式的最左边的1抹掉。每执行一次抹掉一个1,知道全为0位置。