/**
* 面试题15:二进制中1的个数
* 请实现一个函数,输入一个整数,输出该数二进制表示中1的个数
* 例如,把9表示成二进制是1001,有2位是1.因此,如果输入9,则该函数输出2
*/
public class No15 {
public static void main(String[] args) {
//构建测试用例
//功能测试:正常输入-->9
//边界值测试:0等
//特殊值测试: -5
System.out.println(NumberOf1(6));
System.out.println(NumberOf1Normal(6));
System.out.println(NumberOf1(1));
System.out.println(NumberOf1Normal(1));
}
/**
* 剑指offer技巧:把一个整数减去1之后再和原来的整数做位与运算,
* 得到的结果相当于把整数的二进制表示中最右边的1变成0
* @param n 输入的数字
* @return 该数字的二进制表示中1的个数
*/
public static int NumberOf1(int n){
int count = 0;
while(n!=0){
count++;
n = n&(n-1);
}
return count;
}
/**
* 正常按位测试做法
*/
public static int NumberOf1Normal(int n){
int count = 0;
int flag = 1;
while(flag!=0){
if((n&flag)!=0){
count++;
}
flag<<=1;
}
return count;
}
}