java:懂二进制

【题目描述】
世界上有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;
}

猜你喜欢

转载自blog.csdn.net/sinat_35803474/article/details/69935680