题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2。

      利用n&(n-1):把一个整数n减去1,再和原整数做与运算,会把整数最右边一个1变成0。那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。

代码实现:

public int numberOfOne(int n){
     int count=0;
     while(n!=0){
         count++;
         n=n&(n-1);
     }
     return count;
}

        把一个整数减去1之后再和原来的整数做位与运算,得到的结果相当于是把整数的二进制表示中的最右边一个1变成0。很多二进制的问题都可以用这个思路解决。

1)判断一个整数是不是2的整数次方。

        一个整数如果是2的整数次方,那么它的二进制表示中有且只有一位是1,而其他所有位都是0。根据前面的分析,把这个整数减去1之后再和它自己做与运算,这个整数中唯一的一就会变成0。

//判断n是否是2的整数次方
public boolean isPowerOfTwo(int n){
      return (n>0&&(n&(n-1))==0)?true:false;
}

2)判断一个整数是不是4的整数次方。

         一个整数如果是4的整数次方,那么必然满足该整数是2的整数次方。另外,2的偶数次方减去1之后都能被3整除,而2的奇数次方却不能。

public boolean isPowerOfFour(int n){
      return (n>1&&(n&(n-1)==0)&&((n-1)%3)==0)?true:false;
}

3)输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n。

      比如10的二进制表示为1010,13的二进制表示为1101,需要改变1010的3位才能得到1101。第一步求这两个数的异或,第二部统计异或结果中1的位数。

public int countOfDiff(int m,int n){
     int x=m^n;
     int count=0;
     while(x!=0){
          count++;
          x=x&(x-1);
     }
     return count;
}

 

 posted on 2018-09-09 18:55  会飞的金鱼  阅读(126)  评论(0)    收藏  举报