#P0157. __builtin_popcount(x) & lowbit(x)

    传统题 1000ms 256MiB 显示标签>语言基础常用函数

__builtin_popcount(x) & lowbit(x)

题目描述

输入 11 个整数 xx ,求它的二进制表示形式中有多少个 11

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    int x;
    cin >> x;
    cout << __builtin_popcount(x) << endl;
    return 0;
}

函数太难记?没关系,我们有 lowbitlowbit。

lowbitlowbit 操作每次减去 xx 的二进制表示形式中最后一个 11,大家可能会误以为时间复杂度为 O(logn)O(logn) ,(因为一个整数 nn 二进制表示形式最多有 logn\lceil logn \rceil 位),其实时间复杂度为 O(k)O(k)kkxx 的二进制形式中 11 的数量,最坏情况下,即全为 11 时退化为 O(logn)O(logn) ,算法效率极高。

#include<iostream>
using namespace std;
int lowbit(int x)
{
    int ans = 0;
    for (int i = x; i; i -= i & -i) ans ++;
    return ans;
}
int main()
{
    int x;
    cin >> x;
    cout << lowbit(x) << endl;
    return 0;
}

输入格式

共一行,包含一个正整数 xx

输出格式

输出它的二进制表示形式中有多少个 11

数据范围

1x1051 ≤ x ≤ {10}^5

输入样例:

3

输出样例:

2

相关

在下列比赛中:

常用函数