懂二进制(小米)

2016/05/03 C和C++基础

题目描述

世界上有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位置。

Search

    Post Directory