Offer[15] 二进制中1的个数

Posted haoworld

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Offer[15] 二进制中1的个数相关的知识,希望对你有一定的参考价值。

题目描述

  输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

思路分析

  1. 让整数和1相与,可以判断整数二进制表示中最右边一位是否为1,将1左移之后再和整数相与,可以比较右数第二位,循环比较,就可以统计出二进制中1的个数
    (可能一般想到的是将整数右移,之后再和1相与,但是这种方法传入负数时会陷入死循环,因为负数的右移操作会在高位补1,而不是0
  2. 一个整数减去1之后再和原来的整数相与,那么整数二进制中最右边的1会变为0,直到整数变为0,就可以统计出1的个数。

测试用例

  1. 正数(包括边界值1、0x7FFFFFFF)
  2. 负数(包括边界值0x80000000、0xFFFFFFFF)
  3. 0
      
    ## Java代码
public class Offer15 
    public static void main(String[] args) 
        System.out.println("测试正数-->");
        test1();
        System.out.println("测试负数-->");
        test2();
        System.out.println("测试0-->");
        test3();
    
    public static int NumberOf1(int n) 
        return Solution3(n);
    
    /**
     * 解法一: 思路: 上面的思路是移动 整数,我们可以移动与整数相与的1 ,每次判断之后我们将1 向左移动, 这时判断的就是整数所表示二进制中右边的第二位
     * 
     * @param n
     * @return
     */
    private static int Solution2(int n) 
        int count = 0;
        int flag = 1;
        while (flag != 0) 
            if ((flag & n) != 0) 
                count++;
            
            flag = flag << 1;
        
        return count;
    

    /**
     * 解法二: 思路 :利用了一种二进制运算的规律,把一个整数减去1之后再和原来的整数做与运算, 得到的结果相当于把整数二进制中最右边的1变为0
     * 
     * @param n
     * @return
     */
    private static int Solution3(int n) 
        int count = 0;
        while (n != 0) 
            count++;
            n = n & (n - 1);
        
        return count;
    

    /**
     * 测试正数
     */
    private static void test1() 
        System.out.println("0x7FFFFFFF: " + NumberOf1(0x7FFFFFFF));
        System.out.println("1: " + NumberOf1(1));
    

    /**
     * 测试负数
     */
    private static void test2() 
        System.out.println("0x80000000: " + NumberOf1(0x80000000));
        System.out.println("0xFFFFFFFF: " + NumberOf1(0xFFFFFFFF));
    

    /**
     * 测试0
     */
    private static void test3() 
        System.out.println("0: " + NumberOf1(0));
    

代码链接

剑指Offer代码-Java

以上是关于Offer[15] 二进制中1的个数的主要内容,如果未能解决你的问题,请参考以下文章

剑指 Offer 15. 二进制中1的个数

剑指 Offer 15. 二进制中1的个数

剑指offer15. 二进制中1的个数

剑指Offer15. 二进制中1的个数

剑指Offer15. 二进制中1的个数

剑指offer面试题 15. 二进制中 1 的个数