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) }