1. /**
    2. * 面试题15:二进制中1的个数
    3. * 请实现一个函数,输入一个整数,输出该数二进制表示中1的个数
    4. * 例如,把9表示成二进制是1001,有2位是1.因此,如果输入9,则该函数输出2
    5. */
    6. public class No15 {
    7. public static void main(String[] args) {
    8. //构建测试用例
    9. //功能测试:正常输入-->9
    10. //边界值测试:0等
    11. //特殊值测试: -5
    12. System.out.println(NumberOf1(6));
    13. System.out.println(NumberOf1Normal(6));
    14. System.out.println(NumberOf1(1));
    15. System.out.println(NumberOf1Normal(1));
    16. }
    17. /**
    18. * 剑指offer技巧:把一个整数减去1之后再和原来的整数做位与运算,
    19. * 得到的结果相当于把整数的二进制表示中最右边的1变成0
    20. * @param n 输入的数字
    21. * @return 该数字的二进制表示中1的个数
    22. */
    23. public static int NumberOf1(int n){
    24. int count = 0;
    25. while(n!=0){
    26. count++;
    27. n = n&(n-1);
    28. }
    29. return count;
    30. }
    31. /**
    32. * 正常按位测试做法
    33. */
    34. public static int NumberOf1Normal(int n){
    35. int count = 0;
    36. int flag = 1;
    37. while(flag!=0){
    38. if((n&flag)!=0){
    39. count++;
    40. }
    41. flag<<=1;
    42. }
    43. return count;
    44. }
    45. }