作者:猫降龙
时间:2005.8.22.18:52
联系:QQ:289362563
对一个函数的理解
作用:统计一个数中值为1的位的个数。
说明:此函数是将一个数的二进位中,值为1的位的个数加以统计。比如十进制数22,转为二进制是10110 ,它值为1的位的个数是3。
费话:此函数来自<<C与指针>>一书中68页,刚看时云雾缭绕,经过仔细分析后,渐感思路明了,故写下自己的心得与大家分享,函数虽然只有短短几行,但是他里面所涉及的内容远远超过了他的自身的大小(也许本人费话太多),本人水平有限(属菜鸟级别),错误在所难免,望广大高手指点,批评,谢谢。
函数代码:
int count_one_bits(unsigned value)
{
int ones;
/*
**当这个值还有一些值为1的位时...
*/
for(ones=0;value!=0;value=value>>1)
/*
**如果最低位的值为1,计数增1
*/
if(value%2!=0)
ones=ones+1;
return ones;
}
调用函数:
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
unsigned num;
int count;
int string[25];
scanf("%d",&num);
printf("/n");
itoa(num,string,2);
printf("The string is:%s/n",string);
count=count_one_bits(num);
printf("The count is: %d/n",count);
getch();
}
int count_one_bits(unsigned value)
{
int ones;
/*
**当这个值还有一些值为1的位时...
*/
for(ones=0;value!=0;value=value>>1)
/*
**如果最低位的值为1,计数增1
*/
if(value%2!=0)
ones=ones+1;
return ones;
}
分析思路:
int count_one_bits(unsigned value) /*此处定义value为无号整型,所以右移时,为逻辑右移*/
{
int ones;
/*
**当这个值还有一些值为1的位时...
*/
for(ones=0;value!=0;value=value>>1) /*将value在存储单元中右移1位*/
/*
**如果最低位的值为1,计数增1
*/
if(value%2!=0) /*如果value的值为奇数,将ones加1*/
ones=ones+1;
return ones;
}
:::判断奇偶数:::
十进制数中,一个数能被2整除时,证明此数为偶数,不能被2整除时,此数为奇数。
二进制数中,一个数的最低位(最后一位)值为1时,此数为奇数,最低位为0时,此数为偶数。
:::移位操作符:::
移位操作符是将一个值的位全部向左或向右移动
包括"<<(左移)" 和 ">>(右移)"
左移运算符(<<)
用来将一个数的各二进制位全部左移若干位。
在左移位中,值最左边的几位被丢弃,右边空出来的位用0补齐,例如:
a=a<<2
将a的二进制数左移2位,右边空出来的位用0补齐。若a=15,我们用八位二进制数表示,二进制数为00001111,左移2位得到00111100,即为十进制的60
左移前:00001111
左移后:00111100
左移1位,相当于该数乘2,a左移了2位,就相当于乘以4等于60(15X4=60)
右移运算符(>>)
用来将一个数的各二进制位全部右移若干位。
右移1位,相当于该数除2
1.逻辑右移
即为无符号值右移,左边高位移入0,移到右端的低位被舍弃。例如:
a=a>>2
将a的二进制数右移2位,若a=15,用八位二进制数表示,
右移前:00001111
右移后:00000011
2.算术右移
ANSI标准中定义
int(整型)的取值范围为-32767~32767,32767的二进制为0111111111111111,十六位宽,最高位用来表示符号,即符号位,0代表正整数,1代表负整数。
unsigned int(无符号整型)的取值范围为65535,在存储单元中,最高位(符号位)也用来存储数值,所以
65535的二进位表示为1111111111111111
MS系统中,把int定义为16位,long定义为32位
清楚了上面的概念,算术右移就不难理解了。例如:
a: 1111111111000000(-32704)
a>>1: 0111111111100000(逻辑右移)
a>>1: 1111111111100000(算术右移)
即对有符号数右移时,如果符号位原来为1,则左面移入高位的也是1
根据编译器不同,右移的结果也会有所不同(完)。