洛谷 B4577:[GESP202609 三级] 公共二进制位 ← 位运算

【题目来源】
https://www.luogu.com.cn/problem/B4577

【题目描述】
小红有 n 个非负整数 a1,a2,…,an。她将每个整数转换为二进制后,想知道有多少个二进制位在所有整数中均为 1。
二进制位从右向左编号为 0,1,2,…。若某个整数的二进制表示中没有第 k 位,则认为它的第 k 位为 0。
请你求出满足条件的二进制位数量。

【输入格式】
第一行一个整数 n,表示整数的个数。
第二行 n 个非负整数 a1,a2,…,an。

【输出格式】
输出一个整数,表示所有整数的二进制表示中均为 1 的二进制位数量。

【输入样例】
3
13 7 15​​​​​​​

【输出样例】
2

【数据范围】
2≤n≤20000,0≤ai≤10^9。

【算法分析】
代码使用按位与 & 保留数组全部元素共有的二进制 1 位,再用 t&1 取最低位、最后通过右移逐位统计 1 的个数。

【算法代码】

#include <bits/stdc++.h>
using namespace std;

const int maxn=2e4+5;
int a[maxn];
int n;

int main() {
    cin>>n;
    for(int i=1; i<=n; i++) {
        cin>>a[i];
    }
    
    int t=a[1];
    for(int i=1; i<=n; i++) {
        t&=a[i];
    }
    
    int cnt=0;
    while(t) {
        if(t&1) cnt++;
        t>>=1;
    }
    cout<<cnt;

    return 0;
}

/*
in:
3
13 7 15

out:
2
*/



【参考文献】
https://gesp.ccf.org.cn/101/attach/1767258728693792.pdf

posted @ 2026-09-23 21:07  Triwa  阅读(5)  评论(0)    收藏  举报