通过C语言程序将十进制数转化成二进制数,然后求出二进制数中1的个数。

下面用三种方法来实现。来

方法一:除2取余法。对一十进制数,用2辗转相除至结果为1,将余数和最后的1从下向上倒序写就是对应的二进制。

例如:十进制数302转化成二进制。

302/2=151余0;151/2=75余1;75/2=37余1;37/2=18余1;18/2=9余0;9/2=4余1;4/2=2余0;2/2=1余0,故二进制为100101110。(二进制中首位是符号位,正数加1,负数加0)

此方法的缺点是只可以对正数运算,一旦输入负数结果出现错误。

代码如下:

#include<stdio.h>
int main()
{int num,count=0;scanf("%d",&num);while(num){if(num%2==1)count++;/*如果num除2的余数为1时,即为二进制中1*/num=num/2;}printf("count=%d",count);
return 0;
}

方法二:移位法。移位法分为左移和右移两种情况,左移时数的右边都补0;右移时正数左边补0,负数左边补1。C语言中“<<”为左移运算符,“>>”为右移运算符。移位法虽可以正负数进行转换,但它的缺点是效率低下,对于-1这个数需要向右移位32次才能找到对应的二进制数。下面程序用了“右移法”实现十进制到二进制的转换。

代码如下:

#include<stdio.h>
int main()
{int i,num,count=0;scanf("%d",&num);i=32;/*32或64位比特位*/while(i--){if(num&1==1)count++;num=num>>1;/*>>右移运算符;右移时负数补1、正数补0,num>>1指右移1位*/}printf("count=%d",count);
return 0;
}

方法三:按位“与”法,即x=x&(x-1)。此方法不仅可以对正负数进行十进制到二进制的转化,而且效率高。对于整型数在存放地址时,它以32位或64位的补码形式存放。x=x&(x-1)还可以判断某数是否为2的n次方,当结果为0时,则这个数就是2的n次方。

下面对十进制数15进行转换分析:

15的八位二进制数补码为0000 1111.

第一次与运算             x                        0000 1111

x-1                       0000 1110

x&(x-1)                0000 1110---14

第二次与运算             x                        0000 1110

x-1                       0000 1101

x&(x-1)                 0000 1100---12

第三次与运算              x                        0000 1100

x-1                       0000 1011

x&(x-1)                 0000 1000---8

第四次与运算               x                        0000 1000

x-1                        0000 0111

x&(x-1)                 0000 0000---0

进行4次与运算后结果为0,则二进制中1的个数就为4。

代码如下:

#include<stdio.h>
int main()
{int num,count=0;scanf("%d",&num);while(num){num=num&(num-1);count++;/*num不为0时,每进行一次与运算,则二进制中1的个数加1*/}printf("count=%d",count);
return 0;
}

转载于:https://blog.51cto.com/luoyafei/1699262

C语言中写一个函数返回参数二进制中 1 的个数相关推荐

  1. 写一个函数返回参数二进制中 1 的个数

    #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> Fun1(int a) //用移位 ...

  2. 写一个函数返回参数二进制中 1 的个数(三种方法)

    1.运用了除法,取余方式递推出结构 2.运用右移符(>>)运算 3.利用算术与(&)运算 三种方法效率越来越高,减少成本 #include<stdio.h>int Nu ...

  3. 写一个函数返回参数二进制中1的个数

    开始想到的方法是,用取余2除以2循环计数的方法求出参数二进制中1的个数: #include <stdio.h> int count_one_bits(unsigned int x) {in ...

  4. C语言试题二十九之编写函数int function(int lim,int aa[max])求出小于或等于lim的所有素数并放在aa数组中,该函数返回所求的素数的个数。

    1. 题目 编写函数int function(int lim,int aa[max]),该函数的功能是求出小于或等于lim的所有素数并放在aa数组中,该函数返回所求的素数的个数. 2 .温馨提示 C语 ...

  5. 写一个函数,将一个字符串中的元音字母复制到另一个字符串,然后输出

    写一个函数,将一个字符串中的元音字母复制到另一个字符串,然后输出 思路:所谓复制到另一个字符串中,就是使a,b数组中元素一一对应,因为字符串结束的标志是\0,所以最后要赋值\0. #include&l ...

  6. js中写一个函数,第一秒打印1,第二秒打印2

    js中写一个函数,第一秒打印1,第二秒打印2 1.用let块级作用域 for(let i = 0;i<5;i++){setTimeout(()=>{console.log(i);},100 ...

  7. c语言:写一个函数统计字符串的字母,数字,空格,其他字符

    c语言:写一个函数统计字符串的字母,数字,空格,其他字符 #include<stdio.h> #include<stdlib.h> #include<string.h&g ...

  8. c语言有参有类最小公倍数,【C语言】写一个函数,并调用该函数求两个整数的最大公约数和最小公倍数...

    程序分析: 在数学中,两个数的最小公倍数=两个数的乘积/两数的最大公约数. 求两个数的最大公约数,运用辗转相除法:已知两个整数M和N,假定M>N,则求M%N. 如果余数为0,则N即为所求:如果余 ...

  9. [007]C++---写一个函数,返回它自己

    题目: 写一个函数,返回它自身,方法用C或者C++即可. 方法一: 用C++中仿函数的方法,来实现返回自身的引用. 1 #include<iostream> 2 using namespa ...

最新文章

  1. [oracle] Oracle存储过程里操作BLOB的字节数据的办法,例如写入32位整数
  2. ListT 循环修改其中的数据
  3. java爬虫-简单爬取网页图片
  4. 物资管理系统c语言课程设计,C语言实现仓库物资管理系统
  5. Android日志Log使用
  6. raspberrypi 与 arduino 使用 nRF24L01+ 通信 -- raspberry pi为发送端
  7. Day26:configparser、subprocess模块
  8. OC 实现的几个排序算法
  9. 如何设置mysql的运行目录_如何修改mysql数据库文件的路径 | 学步园
  10. 学习java疯狂讲义笔记(连载)
  11. photoshop切片的使用
  12. 机器学习 主成分分析(Principal Component Analysis)
  13. iOS动态库重签名步骤
  14. Chris Cheung
  15. wifi又被隔壁老王蹭了,这样设置路由器,老王再也蹭不了你的wifi了……路由器设置实用教程基础篇
  16. 我手机中的舍不得删除的48条笑话,条条经典!! (转自猫扑)
  17. 狂野飙车8服务器在哪个文件夹,狂野飙车8数据包安装存放位置详解
  18. 支持生僻字且自动识别utf-8编码的php汉字转拼音类,支持生僻字且自动识别utf-8编码的php汉字转拼音类...
  19. 观点五、史上首次揭露广告的真相
  20. 优先使用TimeUnit类中的sleep()(转自 ImportNew - 刘志军 翻译自 javarevisited)

热门文章

  1. 因讨要介绍费引发纠纷 浙江龙湾一男子砍死房产中介
  2. Unity+KBEngine实战系列1——棋牌(含完整教程与源码)
  3. Windows Server 2008 R2无密码共享设置
  4. 分析 Python 脚本
  5. POJ-10031004
  6. BroadLeaf项目搜索功能改进
  7. 「每天一道面试题」谈String和StringBuffer、StringBuilder区别
  8. Apache+php 在windows下的配置
  9. DIV+CSS颜色边框背景等样式
  10. hdu4000 amp;amp; hrbust1625