# 28、整数的二进制表示中1的个数

#include <stdio.h>

void CalNum(int n)
{
int count=0;
while (n!=0)
{
n &=n-1;
count++;
}

printf("The result is :  %d  \n\n",count);
}

int main()
{
int n;
while (printf("Input a number: "),scanf("%d",&n)!=EOF)
{
CalNum(n);
}

return 0;
}

#include <stdio.h>

void CalNum(int n)
{
int count=0;
while (n)
{
if (n&1!=0)
{
count++;
}
n>>=1;
}

printf("The result is :  %d  \n\n",count);
}

int main()
{
int n;
while (printf("Input a number: "),scanf("%d",&n)!=EOF)  //n必须为正数
{
CalNum(n);
}

return 0;
}

#include <stdio.h>

void CalNum(int n)
{
int count=0,flag=1;;
while (flag)
{
if (flag&n)
{
count++;
}
flag<<=1;
}

printf("The result is :  %d  \n\n",count);
}

int main()
{
int n;
while (printf("Input a number: "),scanf("%d",&n)!=EOF)
{
CalNum(n);
}

return 0;
}

int count_ones(unsigned a)
{
a = (a & 0x55555555) + ((a >> 1) & 0x55555555);
a = (a & 0x33333333) + ((a >> 2) & 0x33333333);
a = (a & 0x0f0f0f0f) + ((a >> 4) & 0x0f0f0f0f);
a = (a & 0x00ff00ff) + ((a >> 8) & 0x00ff00ff);
a = (a & 0x0000ffff) + ((a >> 16) & 0x0000ffff);

return a;
}

const int ones[] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2,\
3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4,\
3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2,\
3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5,\
5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5,\
6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3,\
4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3,\
3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5,\
6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6,\
5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8};

int count_ones(unsigned a)
{
return (ones[a & 0xff] + ones[(a >> 8) & 0xff] + ones[(a >> 16) & 0xff]\
+ ones[(a >> 24) & 0xff]);
}

• 本文已收录于以下专栏：

## 编程之美1——一个数的二进制表示中1的个数

• u011694809
• 2015年06月01日 09:10
• 1361

## 求整数N的二进制表示中1的个数

• wyg1065395142
• 2016年05月19日 21:57
• 179

## 快速求二进制中1个数

• a62321780
• 2016年09月19日 22:23
• 706

## 求一个整数中二进制1的个数

• djb100316878
• 2014年12月18日 08:55
• 2747

## 二进制表示法中1的个数最多的整数 构造

1的个数最多的整数 给定整数a和b（0≤a≤b≤263-1），输出区间[a,b]中对应二进制表示含1的个数最多的整数，如果存在多个解，则输出符合条件的最小的整数。 输入格式： 第1行：一个整数T（1≤...
• ECNU_LZJ
• 2017年04月25日 16:27
• 327

## 统计整数n的二进制表示中1的个数

(1)逐位判断（位运算） int counter_ones(unsigned n) { int counter = 0; While (n) { counter += n&1; n >...
• callinglove
• 2015年03月16日 12:56
• 1417

## 32位整数的二进制表示中有多少个1

• u010510962
• 2016年03月17日 16:24
• 1272

## 统计无符号整数二进制中1的个数（Hamming weight）

1.问题来源之所以来记录这个问题的解法，是因为在在线编程中经常遇到，比如编程之美和京东的校招笔试以及很多其他公司都累此不疲的出这个考题。看似简单的问题，背后却隐藏着很多精妙的解法。查找网上资料，才知道...
• K346K346
• 2016年11月24日 11:07
• 933

## java 判断整数二进制中1的个数

• diu_brother
• 2016年03月20日 22:55
• 2792

## 输入一个整数，输出该数二进制表示中1的个数（其中负数用补码表示）--《剑指offer》

• u011514810
• 2016年10月07日 22:48
• 922

举报原因： 您举报文章：28、整数的二进制表示中1的个数 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)