思路

一个正整数的二进制中有多少个比特位为1,最直接可想到的是,将该正整数化为二进制的形式,挨个数出其中有多少个1即可。C语言中,和比特位相关的内容,即是位操作。此处可以将该正整数与 0x01 进行位与,即可得知该数的二进制最低位是否为1,然后将该数向右移动一位,再次判断移动后的最低位是否为1,依次操作,直到该数右移变成0.

代码实现

#include <stdio.h>static void count(int number)
{int cnt = 0;int num = number;if (num < 0)return;do {if (num & 0x01 == 1) cnt++;  } while((num >>= 1) != 0);printf("there are %d one in %d of the binary\n",cnt, number);return;
}int main(void)
{count(2);count(5);count(30);count(32);count(34);count(36);count(38);count(39);count(40);return 0;
}

运行结果

./a.out
there are 1 one in 2 of the binary
there are 2 one in 5 of the binary
there are 4 one in 30 of the binary
there are 1 one in 32 of the binary
there are 2 one in 34 of the binary
there are 2 one in 36 of the binary
there are 3 one in 38 of the binary
there are 4 one in 39 of the binary
there are 2 one in 40 of the binary

注意

此处为何要强调是正整数?因为负数在计算机中的存储方式是以补码形式存在的。需要特别的处理。那么,假设该题变为:求任意一个负整数中有多少个比特位为1,又该怎么处理呢?
此时,看对该问题怎么理解,如果是按照正整数那样,求原码中有多少个比特位为1,那可以根据负数原码的特点:其原码最高位为1,表示负数,其他位的数值,与该负数绝对值所对应的整数一样,比如在32位机器上,+1 的原码是 0000 0000 0000 0000 0000 0000 0000 0001,则 -1 的原码是 1000 0000 0000 0000 0000 0000 0000 0001。那么此时,要求 -1 的原码中有多少个比特位为1,思路是先求 -1 的绝对值中有多少个比特位为1,最后再加上最高位的符号位1即可。

#include <stdio.h>
#include <stdlib.h>static void count(int number)
{int cnt = 0;int num = abs(number);do {if (num & 0x01 == 1) cnt++;  } while((num >>= 1) != 0);if (number < 0)cnt += 1;printf("there are %d one in %d of the binary\n",cnt, number);return;
}int main(void)
{count(2);count(-2);return 0;
}

运行结果:
./a.out
there are 1 one in 2 of the binary
there are 2 one in -2 of the binary

求任意一个正整数的二进制中有多少个比特位为1相关推荐

  1. 实验题目:约瑟夫环问题:设编号为1,2,3,……,n的n(n>0)个人按顺时针方向围坐一圈,m为任意一个正整数。从第一个人开始顺时针方向自1起顺序报数,报到m时停止并且报m的人出列,再从他的下一个人

    实验题目:约瑟夫环问题:设编号为1,2,3,--,n的n(n>0)个人按顺时针方向围坐一圈,m为任意一个正整数.从第一个人开始顺时针方向自1起顺序报数,报到m时停止并且报m的人出列,再从他的下一 ...

  2. C语言计算数字乘积根,c语言,求任意一个整数各位数字之积

    点击查看c语言,求任意一个整数各位数字之积具体信息 答:求整数各位和,将整数各个位分离出来的方法(除10取模)很常用. 函数如下 int intsum(int n) { int sum = 0; wh ...

  3. 角谷猜想:所谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘 3 加 1,如果是偶数,则除以2,得到的结果再按照上述规则重复处理,最终总能够得到 1。如假定初始整数为 5,计算过程分别为 16、

    角谷猜想 Description 所谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘 3 加 1,如果是偶数,则除以2,得到的结果再按照上述规则重复处理,最终总能够得到 1.如,假定初始整数为 5 ...

  4. 【数学】任意一个正整数n最多只有一个质因数大于根号n,怎么证明?

    定理 任意一个正整数n最多只有一个大于 n \sqrt{n} n ​的质因子,并且该大于 n \sqrt{n} n ​的质因子的幂次是1. 证明(反证法) 证明:最多只有一个大于 n \sqrt{n} ...

  5. 蒜头君:所谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘 33 加 11,如果是偶数,则除以 22,得到的结果再按照上述规则重复处理,最终总能够得到 11。如,假定初始整数为 5

    蒜头君:所谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘 33 加 11,如果是偶数,则除以 22,得到的结果再按照上述规则重复处理,最终总能够得到 11.如,假定初始整数为 55,计算过程分别 ...

  6. 【剑指offer】——求出一个正整数的质数因子(Python)

    目录 一.题目描述 二.思路 1.短除法 2.平方根法 一.题目描述 功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 ) 最后一个数 ...

  7. python给定一个整数n、判断n是否为素数_python判断所输入的任意一个正整数是否为素数的两种方法...

    素数(也称质数),是指除了1和该数本身,不能被任何正整数整除的正整数.判断一个正整数m是否为素数,只要判断m可否被2~根号m之中的任何一个正整数整除,如果m不能被此范围中任何一个正整数整除,m即为素数 ...

  8. 用python判断所输入的任意一个正整数是否为素数

    素数(也称质数),是指除了1和该数本身,不能被任何正整数整除的正整数.判断一个正整数m是否为素数,只要判断m可否被2~根号m之中的任何一个正整数整除,如果m不能被此范围中任何一个正整数整除,m即为素数 ...

  9. C++ - 求一个正整数的二进制表示中1的个数

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net /** Created by Chimomo*/#i ...

最新文章

  1. 网络管理常用命令之二 - Ipconfig 命令详解(图文)
  2. 论坛社区做推广要精心的策划
  3. Android Studio 编译: Program type already present: XXX 解决方案
  4. LVS 四层 TCP/UDP 负载均衡器
  5. mxnet系列教程之1-第一个例子
  6. c#给定编码中的字符无效_C#程序检查给定的字符串是否等于(==)运算符
  7. Species Tree(HashTable实现)
  8. 前端现在到底需要什么样的人才
  9. oracle中 sql语句:start with .. connect by prior.. 用法
  10. java 判断int类型为空
  11. 什么样的领导会给公司造成损失呢?
  12. Effective C# 原则42:使用特性进行简单的反射(译)
  13. SaaS软件的应用弱化了不同规模企业的竞争差距
  14. lj245a引脚功能图_零基础入门单片机(2)学会控制IO引脚你就入门啦
  15. 聚焦四个重组,构建基于IPD的卓越研发体系(3.0版)
  16. 一步一步搭建车型数据库小程序
  17. iOS 屏幕适配 X XR XS XSMax 尺寸
  18. vi/vim操作手册
  19. excel行数据不规则解析匹配
  20. 超级详细-NMOS、PMOS的工作原理及相关内容整理(上)

热门文章

  1. pygame.mixer音效
  2. Outlook 收件箱下子文件夹设置邮件提醒
  3. 使用worldview-2立体像对生成dem和正射影像
  4. ubuntu服务器修改root密码
  5. Hercules双核锁步特性介绍
  6. 冯山C语言第六章作业答案,冯山《山路梅花》阅读答案及翻译赏析
  7. 韩国中央大学计算机专业,2020年韩国中央大学专业设置
  8. Flutter的菜鸟教程一:第一个Flutter应用
  9. 第四部分 :特殊用途的句子(虚拟句)
  10. 如何打开win7禁用的无线网卡服务器,Win7系统如何禁用无线网卡 win7禁用无线网卡的方法...