一个非常有用的算法---统计二进制数中1的个数

本人算法小菜,看见一个非常好的算法,统计一个数的二进制数的1的个数。觉得不错,与大家分享。

1 int fun(int x){
2     int count = 0;
3     while(x){
4         count++;
5         x = x &(x-1)
6     }
7     return count;
8 }

  下面是个人的一点解释(欢迎拍砖)

  比如一个数x的二进制后面几位是1000.

x-1的二进制后面几位变成了     0111.

二者&,变成了                            0000

而对于原数x的二进制数而言,就从右端减少了一个1。所以上述算法是计算二进制1的个数。

时间: 2024-10-13 03:26:24

一个非常有用的算法---统计二进制数中1的个数的相关文章

算法-求二进制数中1的个数

普通法: 我总是习惯叫普通法,因为我实在找不到一个合适的名字来描述它,其实就是最简单的方法,有点程序基础的人都能想得到,那就是移位+计数,很简单,不多说了,直接上代码,这种方法的运算次数与输入n最高位1的位置有关,最多循环32次. int BitCount(unsigned int n) { unsigned int c =0 ; // 计数器 while (n >0) { if((n &1) ==1) // 当前位是1 ++c ; // 计数器加1 n >>=1 ; // 移位

统计二进制数中1的个数

方法1: int CountNumOf1(int digital) { int num = 0; while(digital) { if(digital % 2 == 1) { num ++; } digital /= 2; } return num; } 方法2: int CountNumOf1(int digital) { int num = 0; while(digital) { num += (digital % 2) ? 1: 0; digital /= 2; } return num

统计二进制数中的1的个数(0277)

程序设计C 实验二 题目五 统计二进制数中的1的个数(0277) 整数在计算机中使用二进制的形式表示,如整数7用二进制表示为:111,其中1的个数为3. 输入一个整数:7 输出该整数用二进制表示时,其中1的个数:3 代码: #include<iostream> #include<math.h> using namespace std; int max(int a, int b) { return a > b ? a : b; } int min(int a, int b) {

计算一个二进制数中1的个数

如果我们要计算一个二进制数中1的个数,很显然会想到运用位运算的知识来解决. 前面有篇博文,讲如何判断一个数是否是2的幂,其实就是判断一个二进制数中是否仅含有一个1,解法是x & x - 1. 在理解上式的前提下,我们可以发现,如果二进制数x中包含不止一个1,那么x&x-1的结果就使得原先的x失去的最末尾了一个1. 因此,我们可以利用x&x-1循环得到x中1的个数. 代码如下: 1 int 2 CountOnes(int num) 3 { 4 int count; 5 for (co

求二进制数中1的个数(编程之美)

求二进制数中1的个数 继京东618店庆时买的<编程之美>这本书,翻了翻,发现里面的题还是挺有意思的,看起来我们觉得很简单的题目,解法却有很多很多种,真是一个比一个巧妙,于是,决定记录一下. 书中的题目如下 对于一个字节(8bit)的无符号数,求其二进制表示中"1"的个数,要求算法的执行效率尽可能高. 就像书中给我们说的一样,我们一般人可能想到的解决方法如下 int countOne(int n){ int count=0; while(n){ if(n%2==1){ cou

[华为机试练习题]45.求某二进制数中1的个数

题目 描述: 题目标题: 求某二进制数中1的个数. 给定一个unsigned int型的正整数,求其二进制表示中"1"的个数,要求算法的执行效率尽可能地高. 详细描述: 原型: int GetCount(unsigned int num) 输入参数: num 给定的正整数 输出参数(指针指向的内存区域保证有效): 无 返回值: 返回1的个数 举例: 输入13,则对应的二进制是1101,那么1的个数为3个.则:返回3. 练习阶段: 初级 代码 /*--------------------

编程之美-02数字之魅-求二进制数中1的个数

题目:求二进制数中 1 的个数 对于一个字节(8bit)的无符号整型变量,求其二进制表示中"1"的个数,要求算法的执行效率尽可能地高. 解法一:移位->判断->累计 解法二:除2->判断->累计 解法三:v &= (v -1)需要掌握 ? 2 3 4 5 6 7 8 int num = 0; while(v) {     v &= (v -1);     num++; } return num; ? 2   解法四:分支操作(swicth-cas

求二进制数中1的个数——引发的问题

<编程之美>书中有这样的一道问题“求二进制数中1的个数” 题目:对于一个字节(8bit)的无符号整形变量,求其二进制中“1”的个数,要求算法的执行效率尽可能高. 我使用java语言处理:输出结果是3 public class Count { public static int Count(byte d){ int num = 0; while (d != 0) { d &= (d-1);//比较1的个数 num++; } return num; } public static void

1146: 零起点学算法53——数组中插入一个数

1146: 零起点学算法53--数组中插入一个数 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 1749  Accepted: 613[Submit][Status][Web Board] Description 给定有序数组(从小到大),再给你一个数,要求插入该数到数组中并保持顺序 Input 多组测试,每组第一行输入一个整数n,然后是n个有序的整数 第二行输入1个整数m和1个整数K Outpu