首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一个位运算的程序,有点不理解为什么这么写?该怎么解决

2012-05-27 
一个位运算的程序,有点不理解为什么这么写?题目是写一个函数,对一个16位的二进制数取出它的奇数位。程序是

一个位运算的程序,有点不理解为什么这么写?
题目是写一个函数,对一个16位的二进制数取出它的奇数位。
程序是以下内容:哪个高手能帮我解释一下吗?想了很久了,痛苦啊!
main()
{unsigned getbits(unsigned);
unsigned int a;
printf("\nInput an octal number:");
scanf("%o",&a);
printf("result:%o\n",getbits(a));
}
unsigned getbits(unsigned value)
{int i,j,m,n;
unsigned int z,a,q;
z=0;
for(i=1;i<=15;i+=2)
{q=1;
for(j=1;j<=(16-i-1)/2;j++)
q=q*2;  
a=value>>(16-i);
a=a<<15;
a=a>>15;
z=z+a*q;
}
return(z);



[解决办法]

C/C++ code
unsigned getbits(unsigned value){    int i,j;    unsigned int z,a,q;    z=0;    //value由16个bit组成,xxxx xxxx xxxx xxxx,该循环从其下标为1的位开始计算(0位位偶数为直接跳过)    //我们可以看到最后的返回结果为z,也就是说直接观察z如何计算的,z是由多次循环 a*q相加得到,所以观察a、q如何计算的    //假设i是3,a是数据右移13位,假设数据位1110 1111 0011 1100所以得到的数据最右边一位是下标为13的数据,即111,然后再左移    //15位得到1000 0000 0000 0000,然后再右移15位得到1,所以这三步的目的在于得到第x位的位数据,那么我们可以猜测q的计算的目的在于    //得到该位的次方。所以其思想是获取所有奇数位数据,并乘以2^(i/2),最后全部相加    for(i=1;i<=15;i+=2)    {        q=1;        for(j=1;j<=(16-i-1)/2;j++)            q=q*2;        a=value>>(16-i);        a=a<<15;        a=a>>15;        z=z+a*q;    }    return(z);}
[解决办法]
很奇怪,简单的程序写这么复杂干啥啊?

unsigned int getbits(unsigned int value)
{
int i,j;
unsigned int z =0;
 unsigned int nMask=1; 
 unsigned int nMask2=1; 

for(i=1;i<=15;i+=2)
{

if (value&nMask)
z|=nMask2;
nMask2*=2;
nMask*=4;
}
return(z);
}

热点排行
Bad Request.