一个位运算的程序,有点不理解为什么这么写?
题目是写一个函数,对一个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);
}
[解决办法]
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);
}