前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【简单】二进制中1的个数

【简单】二进制中1的个数

作者头像
字节星球Henry
发布2021-08-09 16:52:18
5090
发布2021-08-09 16:52:18
举报

给定一个长度为 n 的序列,请你求出数列中每个数的二进制表示中 \rm{1} 的个数。

输入格式

第一行包含整数 n 。第二行包含 n 个整数,表示整个数列。

输出格式

共一行,包含 n 个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中 \rm{1} 的个数。

数据范围

{\rm{1}} \le {\rm{n}} \le {\rm{100000}}$``${\rm{0}} \le {\rm{数列中元素的值}} \le {\rm{10^9}}

输入样例
代码语言:javascript
复制
5
1 2 3 4 5
输出样例
代码语言:javascript
复制
1 1 2 1 2
题解

(lowbit)

(\rm{x}\&\rm{-x})\Longleftrightarrow(\rm{x}\&(\sim\rm{x+1}))$``$\rm{1010101000} 经过 \sim 运算后为 \rm{0101010111}+1 后为\rm{0101011000} ,故 \rm{x}\&(\sim\rm{x+1}))$``$\rm{1} 之前的所有数都与为 \rm{0} ,即 \begin{bmatrix} 1 & 0 & 1 & 0 & 1 & 0 & 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 1 & 0 & 1 & 1 & 0 & 0 & 0\end{bmatrix}$``$\rm{0000001000}

基础拓展:

\rm{x}=\rm{000}\cdots\rm{01010} 为例:源码(x ):\rm{000}\cdots\rm{01010} 反码(\sim x ):\rm{111}\cdots\rm{10101} 补码(\sim x+\rm{1} ):\rm{111}\cdots\rm{10110}

计算机中使用补码来存储负数。

C++ 代码
代码语言:javascript
复制
#include <iostream>

using namespace std;

int lowbit(int x)
{
    return x & -x;//x & (~x + 1)
}

int main()
{
    int n;
    cin >> n;
    while(n--)
    {
        int x, res = 0;
        cin >> x;
        while(x)
            x -= lowbit(x), res++;    //每次减去x的最后一位1
        cout << res << " ";
    }
    return 0;
}

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 输入格式
  • 输出格式
  • 数据范围
  • 输入样例
  • 输出样例
  • 题解
  • C++ 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档