github

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

 Java中提供类库

public int NumberOf1(int n) {
        // 库函数
         return Integer.bitCount(n);
}

当然,我不推荐在面试的时候用这个,因为底层的bitCount()我愁了好久也没看懂啥意思,问到就凉了.

/**
 * 二进制中1的个数
 * <p>
 * 输入一个整数,输出该数二进制表示中1的个数。
 * 其中负数用补码表示。
 */
public class _010_NumberOf1 {
    public int NumberOf1(int n) {
        // 库函数
//         return Integer.bitCount(n);
        // 自己手写一个简单的计数器
//        return count1ByBin(n);
        // 作者推荐算法.
        // 循环次数只和二进制中的 1 的个数有关.,明显降低循环次数.
        // 循环时间与二进制中1的个数正相关。
        int count = 0;
        while (n != 0) {
            ++count;
            n = (n - 1) & n;    // 扔掉最后一位1
        }

        return count;
    }

    private int count1ByBin(int n) {
        int count = 0;
        int flag = 1;
        // 和 int 的 字节有关,可以理解为:32次循环
        while (flag != 0) {
            if ((n & flag) != 0) {
                count++;
            }
            flag = flag << 1;
        }
        return count;
    }
}

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐