首先要弄清楚一个问题:n的二进制中第k位是几?
例如 n = 15 = 1111B ,从右向左数第0,1,2.....位
- 先把第k位移动到个位 即n>>k
- 将个位 & 1 即n>>k & 1
通过方法我们可以表示出十进制数在计算机内部以二进制表示的形式,以及求第k位.
认识lowbit 函数
lowbit(x) 返回 x 最右边的1及后面的数字
例如1010B 返回10
10000B 返回10000
lowbit(x) 即 返回的是 x&(-x)
在C++中(-x) 等价于 (~x+1)
证明如下:
- x = 1010.....1000
- ~x = 0101......0111
- ~x + 1 = 0101....1000
- x&(~x+1) = 1000
利用lowbit(x) 方法,就可以求出某个数二进制中有多少个1
Java代码:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
while(n -- != 0){
int x = sc.nextInt();
int res = 0;
while(x != 0){
x -= lowbit(x);
res ++;
}
System.out.print(res + " ");
}
}
public static int lowbit(int x){
return x & -x;
}
}