2013高考分数查询:一道c语言例题,麻烦哪位高手讲解一下!谢谢

来源:百度文库 编辑:杭州交通信息网 时间:2024/05/04 07:08:00
写一个函数,对一个16位的二进制数取出它的奇数位(即从左边起的1、3、5...15位)
函数是这样的:
unsigned short getbits(unsigned short value)
{int i,j;
unsigned short int z,a,q;
z=0;
for(i=1;k=15;i+=2)
{q=1;
for(j=1;i<=(16-i-1)/2;j++)
q=q*2;
a=value>>(16-i);
a=a<<15;
a=a>>15;
z=z+a*q;
}
return(z);
}
它的运算流程是怎么样的,不是很能理解,麻烦哪位给讲解一下!谢谢
错了for(i=1;k=15;i+=2)
不好意思是:for(i=1;i<=15;i+=2)

unsigned short getbits(unsigned short value)
{int i,j;
unsigned short 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);
}
程序应该是这样的。
for(i=1;i<=15;i+=2) //得到需要的每个奇数

q=1;
for(j=1;j<=(16-i-1)/2;j++)
q=q*2;//得到需要的二进制位的位置
因为1=0001,2=0010,4=0100,8=1000,依次类推

a=value>>(16-i);
a=a<<15;
a=a>>15;
是把value里的第i位的数字保留,其余位置0

z=z+a*q;
每次循环把提出来的a按照q的位置写到z里面

return(z);返回z的值

一楼的程序得到的结果和这个结果不一样,因为q每次变化的位置是连续的。
如果输入1010101010101010,原程序得到的是11111111,而一楼的程序得到的是1010101010101010

我也不理解,干嘛要写得这么烦,一句话不就行了。
unsigned short getbits(unsigned short value)
{
return value & 0xAAAA;
}

for(i=1;k=15;i+=2) 好像是无限循环,不对哦。