题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
public class Main12 {
/**
* 该方法没有考虑到负数的情况,如果是负数就会死循环
* @param n
* @return
*/
public static int NumberOf1(int n) {
int sum = 0;
while (n != 0) {
if ((n & 1) != 0)
sum++;
n = n >> 1;
}
return sum;
}
/**
* 该方法为了避免死循环,首先把n和1与运算,判断n的最低位是不是1,
* 接着把1左移一位得到2,判断n的次低位是不是1.。。。
* 缺点是不管n的值是多少都要循环32次
* @param n
* @return
*/
public static int NumberOf2(int n) {
int sum = 0;
int flag = 1;
while (flag != 0) {
if ((n & flag) != 0)
sum++;
flag = flag << 1;
}
return sum;
}
public static int NumberOf3(int n) {
int sum = 0;
while (n != 0) {
sum++;
n = n & (n - 1);
}
return sum;
}
public static void main(String[] agrs) {
System.out.println(NumberOf3(5));
}
}
最后一种方法
、