给定一个长度为 nn 的数列,请你求出数列中每个数的二进制表示中 11 的个数。
输入格式
第一行包含整数 nn。
第二行包含 nn 个整数,表示整个数列。
输出格式
共一行,包含 nn 个整数,其中的第 ii 个数表示数列中的第 ii 个数的二进制表示中 11 的个数。
数据范围
1≤n≤1000001≤n≤100000,
0≤数列中元素的值≤1090≤数列中元素的值≤109
输入样例:
5
1 2 3 4 5
输出样例:
1 1 2 1 2
本题主要考察位运算的概念,由于计算机内部进行位运算是通过补码进行,故可以直接根据x & -x进行为1的最低位求解
代码如下:
import java.util.Scanner;
@SuppressWarnings("all")
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int [] arr = new int[n];
for(int i = 0 ; i < n; i++){
arr[i] = scanner.nextInt();
}
for(int i = 0; i < n; i++){
System.out.print(account(arr[i]) + " ");
}
}
public static int lowBit(int n){
return n & -n;
}
public static int account(int n){
int sum = 0;
while(n != 0){
n -= lowBit(n);
sum++;
}
return sum;
}
}