题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
直接上代码
//1.最优的解题方式
private static int NumberOf1(int n) {
int count = 0;
while (n != 0) {
++count;
n = (n - 1) & n;
}
return count;
}
//2.这种方式比较容易想到 但是增加了无谓的循环次数
private static int NumberOf1_low(int n) {
int count = 0;
int flag = 1;
while (flag != 0) {
if ((n & flag) != 0) {
count++;
}
flag = flag << 1;
}
return count;
}
解题思路
设置一个标志位flag = 1,利用flag与n进行按位的与运算,及可筛选出n中哪一位等于1 ,利用count来计数。
flag =1 在循环中一直左移,超出int范围时,flag = 0
顺便提一下int的取值范围: - 2^31 ~ 2^31 -1
测试
public static void main(String[] args) {
int flag =1;
for(int i = 1 ;i <= 32 ;i++) {
flag = flag <<1;
System.out.println("flag = "+flag +",i = "+i);
}
}
结果