欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 算法刷题笔记 二进制中1的个数(C++实现)

算法刷题笔记 二进制中1的个数(C++实现)

2025/2/23 23:37:50 来源:https://blog.csdn.net/hanmo22357/article/details/139626006  浏览:    关键词:算法刷题笔记 二进制中1的个数(C++实现)

文章目录

    • 题目描述
    • 基本思路
    • 实现代码

题目描述

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

输入格式

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

输出格式

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

数据范围

  • 1 ≤ n ≤ 100000,
  • 0 ≤ 数列中元素的值 ≤ 10^9

基本思路

  • 这道题是一道典型的位运算的题目。一种常用的位运算是lowbit运算,即找出一个二进制数中最低位的1及其后面所有的0。例如,对于整数10,其二进制表示为1010,对该数字使用lowbit操作,得到的结果即1010中最后的一个1及其跟着的0,即10
  • lowbit操作的具体过程即将原始数字与该数字的补码进行按位与运算。
  • 每次将当前数字的lowbit结果从该数字中减去,相当于将原始数字中最后一位1修改为0。重复这个过程,到最后即可将原始数字中所有的1都修改为0,操作的次数即该二进制数中1的个数。

实现代码

#include <cstdio>const int N = 100010;
int arr[N];int count_of_one(int n)
{int result = 0;while(n != 0){n -= n & (-n);result ++;}return result;
}int main(void)
{int n;scanf("%d", &n);for(int i = 0; i < n; ++i) scanf("%d", &arr[i]);for(int i = 0; i < n; ++i) printf("%d ", count_of_one(arr[i]));return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词