11. 位运算-二进制中1的个数

题目描述

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

/**
 * Created by ZengXihong 2019-06-05.
 * #题目描述
 >输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
 */
public class Solution11 {
    public static int NumberOf1_1(int n) {
        //采用 Integer 类方法
        return Integer.bitCount(n);
    }

    public static int NumberOf1_2(int n) {
        /**
         *  假设 n 的二进制表示为   100001000
         *  则 n-1 的二进制表示为   100000111
         *  n & (n-1)              100000000    计数加1,下一个1 为倒数第 9 位
         *  原理:
         * 1. 将一个数字表示为二进制
         * 2. 从右往左数 1 的个数
         * 3. 将 n 减去 1 后,从右往左的第一个 1 ,其位变为0,且该位 左边不变,右边全为 1
         * 4. 将 n 和 n-1 进行 与 计算。则得到,该值 左侧依旧不变,该位以及后边 均为 0
         * 5. 下一位则是原数 n 从右往左的第二个1,也即为【与运算】的结果从右往左的 第一个 1 (和第 2 步循环)
         * 6. 当最后为 0 时,则退出循环
         */
        int count =0;
        while (n!=0){
            ++count;
            n = n & (n-1);
        }
        return count;
    }

    public static void main(String[] args) {
        System.out.println(NumberOf1_1(10));
        System.out.println(NumberOf1_2(10));
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。