原题
给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 11 的个数。
输入格式
第一行包含整数 n。
第二行包含 n个整数,表示整个数列。
输出格式
共一行,包含 n 个整数,其中的第 i个数表示数列中的第 i个数的二进制表示中 11 的个数。
数据范围
1≤n≤100000,
0≤数列中元素的值≤109
输入样例:
5
1 2 3 4 5
输出样例:
1 1 2 1 2
我的题解:
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 num = sc.nextInt();
int ans = 0;
while(num != 0)
{
num &= num - 1; // 易证可以消去最低位1
//或者lowbit(X)也可以,比如x -= lowbit(X), lowbit(x) = x & -x(运用补码)
ans ++; //lowbit()输出只保留输入参数的最低位1的二进制数
}
System.out.printf("%d ",ans);
}
/*while(n -- > 0)
{
int num = sc.nextInt();
int ans = 0;
while(num != 0)
{
if (num % 2 == 1) ans ++;
num = num / 2;
}
System.out.printf("%d ",ans);
}*/ //暴力
}
}
其它位运算例题
判断是否为2的幂次方显然可以利用二进制位运算,规律发现2的幂次方只有一位为1,其余位均为0.故可以通过 x & -x == x
该运算判断(利用补码进行&运算可以求得只保留该数最低位的1,其余均变为0,故可以利用这个运算后是否还等于自己本身来判断)注目:x<0的情况也要讨论一下,是不可能为2的幂次方。