java:懂二进制

来源:互联网 发布:ubuntu 查看内核版本 编辑:程序博客网 时间:2024/06/16 07:25

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

//javapublic 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;}
0 0
原创粉丝点击