码迷,mamicode.com
首页 > 编程语言 > 详细

用C语言写一个函数返回参数二进制中1的个数

时间:2015-10-22 06:55:53      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:c语言编程   函数   返回二进制1的个数   


首先,给出正确的C语言代码如下:

#include <stdio.h>

int count_one_bits(unsigned int value)

{

int count =0;

while(value)

{

if(value%2==1)

{

count++;

}

value=value/2;

}

return count;

}

int main()

{

unsigned int num=0;

int ret=0;

scanf("%d",&num);

ret=count_one_bits(num);

printf("count=%d\n",ret);

return 0; 

}

运行结果如下图:

技术分享

技术分享

但是,当将函数里面的参数里的unsigned以及主函数里的unsigned去掉的时候,运行的结果变成了这样:

技术分享

为什么会产生这样的结果呢?

    先说说unsigned。unsigned是修饰int、char的类型说明符。表示被修饰的数据类型是一个无符号数,即最高位不表示符号位。整型的每一种都有无符号(unsigned)和有符号(signed)两种类型(float和double总是带符号的),在默认情况下声明的整型变量都是有符号的类型(char有点特别),如果需声明无符号类型的话就需要在类型前加上unsigned。无符号版本和有符号版本的区别就是无符号类型能保存2倍于有符号类型的数据,比如16位系统中一个int能存储的数据的范围为-32768~32767,而unsigned能存储的数据范围则是0~65535。

    以上面的-1为例。如果去掉unsigned,说明需要考虑其符号位(0正1负)。因为负数在计算机中存储以补码存储。有符号的整形(整形)在计算机中占据4个字节(32位)存储空间。-1的补码为:1111 1111 1111 1111 1111 1111 1111 1111.最高位的1表示符号位。之所以最后count值为0,是因为没有执行“count++;”语句。

为什么会没有执行“count++;”语句呢?接下来,看一段代码及其运行结果:

技术分享

    通过上面的程序运行结果即就是说-1除以2取余得到仍是-1。结合上面给出的正确代码里面的函数部分,只有执行if(value%2==1)成立时,才会给count自加。而现在(以-1为例),表达式的左边为-1,右边为1,左右永远都不会相等,自然count不会自加,进而,最后输出的count为0。

怎么在不加unsigned的情况下,还能使得程序运行正确呢?

    因为-1的补码含有32个1,我们巧妙的发现它“与”上1的二进制结果竟为1。所以,将代码改为如下:

#include <stdio.h>

int count_one_bits(int value)

{

int count =0;

int i=32;

while(i)

{

if(value&1==1)

{

count++;

}

value=value>>1;//每算完一位,左移,算下一位

i--;

}

return count;

}

int main()

{

int num=0;

int ret=0;

scanf("%d",&num);

ret=count_one_bits(num);

printf("count=%d\n",ret);

return 0; 

}

编译执行程序,得到运行结果为:

技术分享

技术分享

第一篇博客,难免语言上有表达不到位的地方,望大家原谅。同时,欢迎批评指正。。谢谢。技术分享

本文出自 “阳光下的向日葵” 博客,请务必保留此出处http://10796797.blog.51cto.com/10786797/1705026

用C语言写一个函数返回参数二进制中1的个数

标签:c语言编程   函数   返回二进制1的个数   

原文地址:http://10796797.blog.51cto.com/10786797/1705026

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!