题目描述
输入一个整数,输出该数二进制表示中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));
}
}