位运算


原题

给定一个长度为 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的幂次方。

参考

原题链接

参考视频


Author: 寒风渐微凉
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source 寒风渐微凉 !
 Previous
Next 
  TOC