【题目描述】
世界上有10种人,一种懂二进制,一种不懂。那么你知道两个int32整数m和n的二进制表达,有多少个位(bit)不同么?
【输入例子】:
1999 2299
【输出例子】:
7
思路:刚开始的时候,并没有读懂题意,再多读几遍,就是要求两个二进制有几位不同。
因为我们知道两位二进制数在某一位上有不同,那么他们异或的时候,那一位就会是1。所以如果能够知道他们想与的结果有几个1不就可以了吗。
所以我们又想到了一个求某个二进制中有几个1的办法,就是用到与运算。
int func(int num){
int temp=0;
while(num!=0){
temp++;
num=num&(num-1);
}
/*
为什么while的条件是num不等于0,因为循环每次执行 num=num&(num-1),最终num会等于0的,num等于0,&运算就可以结束了。
【举个栗子】:假设x=9,即1001;那么x-1=8,1000。
1001 9
&1000 8
———————
1000 8
&0111 7
———————
0000
执行了两次后num为0,所以9的二进制中有2个1,其他的例子也是一个意思
*/
return temp;
}
方法1:
//java
/**
* 获得两个整形二进制表达位数不同的数量
*
* @param m 整数m
* @param n 整数n
* @return 整型
*/
public class solution(int m,int n){
int a=m^n;//异或
int count=0;
//求a中1的数量
while(a>0){
count++:
a=a&(a-1);
}
}
方法2:
思路:还是异或,然后把异或得到的结果,每位都和1相与。具体实现就是异或的结果每次和1相与后就右移1位
//java
public class solution(int m,int n){
int a=m^n;//异或
int count=0;
while(a!=0){
/*
如果某一位上&1等于1,那么证明某一位上就是1
*/
if(a&1==1){
count++;
a>>=1;//右移
}
}
}
方法3:
思路:将m和n逐位比较,若相等,count就+1;具体实现:先比较他两的最低位,然后右移,又继续比较他两的最低位,直到比完。如何取得最低位?和1相与。
最后一位和1相与,得到他本身
前面的和0相与,得到0
public class solution(int m,int n){
int len=32;//根据题意:两个int32整数m和n的二进制表达
int count=0;
while(len){
int m_low=m&1;//取得m的最后一位
int n_low=n&1
if(m_low!=n_low){
count++;
m>>=1;
n>>=1;
len--;//往右移,所以长度要-1;
}
}
return count;
}