题目:
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
分析:
除了将数表示成二进制,逐位判读是否为1;
还可通过右移原数,将数最后一位与1相与,判读最后一位是否为1(此时要移动原数,有可能为负数,导致死循环);
相同方式,可以左移标志位,使标志位逐个为1,与原数相与,求个数;
最常见的高效方式是使原数与原数减1相与,可求出个数。
实现:
<span style="white-space:pre"> </span>// 方式4
public int sum(int n) {
int count = 0;
while (n != 0) {
count++;
n = (n - 1) & n;
}
return count;
}
// 方式3
public int num(int n) {
int count = 0;
int flag = 1;
while (flag != 0) {
if ((n & flag) != 0)
count++;
flag = flag << 1;
}
return count;
}