一道c语言例题,麻烦哪位高手讲解一下!谢谢

写一个函数,对一个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
温馨提示:内容为网友见解,仅供参考
第1个回答  2006-07-20
我也不理解,干嘛要写得这么烦,一句话不就行了。
unsigned short getbits(unsigned short value)
{
return value & 0xAAAA;
}
第2个回答  2006-07-20
for(i=1;k=15;i+=2) 好像是无限循环,不对哦。

一道c语言问题,请各位高手们帮帮忙,谢谢
char p[][20]={“get”,”put”,”out”};p是一个有3个元素的数组,数组中的每个元素都是一个char[20]类型的数组。也就是说,p是一个二维数组。strlen(p[0])+strlen(p[1])+ strlen(p[2])即计算p中的三个字符串的长度总和,为3+3+3=9。

请问这个c语言程序题怎么做呀,能具体解释一下吗,谢谢啦
答案是A 表达是(!x==0)按照符号优先级,!大于== !(逻辑取反),C语言中非零为真 !x==0,只有当x为非零数成立,成立,即为真。当x为0时候,表达式不成立,为假。结论:x为0即为假,x不为0为真。B x :即x非零为真,正确。C x!= 0 :当x为0的时候为假,x不为0的时候成立...

麻烦各位大神可以用C语言描述这道题目么,用代码,谢谢
一、递推法:main(){ int n,i;float a=1200,b;scanf("%d",&n);for(i=1;i<n;i++)b*=1+10.0\/100;printf("第%d年的工资是%5.0f元。\n",n,b);} 二、递归法 float f(float a,float v,int n){ if(n==1)return a;else return (1+v)*f(a,v,n-1);} main(){ ...

c语言有一道题不会做,求高手解,最好分析一下。
答案是:C 因为scanf("%c%c",&a,&b);接收的是1和2,在输入后按了“回车”这个回车符会传递到下一句,也就是:c=getchar(); ,这样 c 赋值为回车符了;d=getchar(); 接着就是这句,你输入34的时候,d 只接收单个字符,也就是 3 ;所以最后的输出是:12 3 ...

C语言例题 说反话,求大佬帮我解释一下?
而p+1指向的目标(即空格后面的一个字符)不是空格,则执行这个if的“体”。printf("%s ", p+1);\/\/这里为什么是p+1?——题目要求是只用“一个空格”隔开单词,那么既然前一句*p = '\\0';使空格变为'\\0'了,p+1不就是下一个字母元素(肯定是字母且是单词的开头)吗?

C语言一道简单的代码,麻烦帮我解析一下,我表示看不懂。。。
if(x<y) 由于10<20,所以 跳到if(!ok1) 这里ok1=5 表示非0 ,所以 !ok=0,所以程序接着执行else后面的 if(ok2) 因为ok2=0;所以接着执行a=-1 整个流程是:if (x<y)->if(!ok1)->else->if(ok2)->a=-1

一道C语言编程问题,高手们来看看帮忙解答下
int b;int c;int sum;\/\/ABC之和。for (a = 100;a > 0;a--)\/\/以A为循环变量,在1到100之间。{ for (b = a-1;b > 0;b--)\/\/以B为循环变量,在1到A之间。{ for (c = b-1;c > 0;c--)\/\/以C为循环变量,在1到B之间。{ \/\/判断公式左右两侧是不是相等,相等侧符合题...

一道c语言编程题求大神解答,找一下我错在哪了,谢谢了?
错误1:宏定义最后没有分号,将#define D 500;改为#define D 500 错误2:l不是整数,因此将l定义为int型就错了 错误3:既然规定输入格式为P=,那么输入时就不能直接输入数值,而应在数值之前输入P=,例如输入P=6000 另外,程序的不妥之处:1、利润不一定是整数,因此将P定义为int型不妥 2、...

一道c语言的计算题。求细致一点的讲解~~~追加!!
p = &nArr[1];说明p是指针,指向数组的第二个元素。nArr[1]是数组的第二个元素,nArr[0]才是第一个元素。这里强调一点p才是指针,*p是指向的值。*为解除引用运算符。p+3就是使得p指向第五个元素,则此时*(p+3)的值为就是nArr[5]=7,则值为10如图所示,答案是10.望采纳....

一道C语言的运算题,题目如图,请详细解答一下,谢谢!
加0.5是为了算四舍五入的,这一点是首先要知道的。=是赋值语句,要从右往左看,因此B首先是将n小数点后移2位,方便对它进行四舍五入。并将最后的值赋入m,m类型为int整型,得到一个整数,再将m\/100.0 浮点型保留小数,得到2位。由此B对。A是保留3位小数 C和D明显错误。

相似回答