23:一个整数的二进制表示中有多少个1

题目:

一个整数存储在内存中,输出它的二进制表示中1的个数

思路:

要判断这个整数的二进制表示中1的个数,联想到这是[位运算]的题目。

最先想到巧妙利用[1]这个数,[1]只有最右一位是1,其他位均为0;

所以,接下来应该想到,用“1”和这个整数做[与运算],首先可以判断最右边一位是不是1,以此类推,该整数每右移一位,和1做与运算,直到该整数变为0.至此,问题思路已有,但是考虑非正常数字,比如[负数],该方法就不适用,因为负数二进制需要保持最高位一直为1,最后会陷入死循环(OXffffffff)前面的思路中,两个数与运算,那能否让[1]进行左移位,而原整数不动,这样可以判断次高位是否为1.以此[1]继续左移.

还有一种思路,一个不为0的整数i,至少有一位为1,做这样的操作:

i-1 得到的结果是  整数i的最右边一位1的右边所有原来为0的位都变为1,1这一位变为0,即减1后最右边1之后的所有位都取反了;然后把它和i做与运算,结果是将最右边一位1之后的所有位都变为0了,所以,反复这样的步骤,做多少次减1的操作,i的二进制表示就有多少个1,直到多次减1后i变为0. 

另:清除最右边一位为0 的方法:

i=i&(i-1)

package prctice01;
/*题目:
一个整数存储在内存中,输出它的二进制表示中1的个数*/
import java.util.Scanner;
public class numberof1 {
public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        while(in.hasNext())
        {
            int input = in.nextInt();
            int count = 0;
            while(input!= 0)
            {
                input=input&(input-1);
                count++;
            }
            System.out.println(count);
    }
    }
//i=i&(i-1)
}

 

posted @ 2016-07-23 10:42  sunshinelym  阅读(470)  评论(0编辑  收藏  举报