关于C语言的问题,大神们,帮个忙谢谢谢谢谢谢
编写一个函数getbits,从一个16位的单元中取出某几位(即该几位保留原值,其余位为0)。函数调用形式为:getbits(value,n1,n2)valuen为该16位...
编写一个函数getbits, 从一个 16位的单元中取出某几位(即该几位保留原值,其余位为 0)。函数调用形式为:
getbits(value, n1, n2)
valuen 为该 16位 (两个字节)单元中的数据值,n1 为欲取出的起始位,n2 为欲取出的结束位。如:
getbits(0101675,5,8)表示对八进制101675 这个数,取出它从左面起的第 5 位到第 8 位。 展开
getbits(value, n1, n2)
valuen 为该 16位 (两个字节)单元中的数据值,n1 为欲取出的起始位,n2 为欲取出的结束位。如:
getbits(0101675,5,8)表示对八进制101675 这个数,取出它从左面起的第 5 位到第 8 位。 展开
3个回答
展开全部
#include "stdio.h"
int getbits(char *value,int n1,int n2){
unsigned short t,v;
if(value[0]=='0' && (value[1]|0x20)=='x')
t=16;
else if(value[0]=='0' && value[1]>='1' && value[1]<='9')
t=8;
else if(value[0]=='1' && value[1]<='9')
t=10;
else{
printf("Input error, exit...\n");
return 0;
}
for(v=0;*value;(v*=t)+=*value++-'0');
printf("\n");
for(t=0x8000>>n1;n1<=n2;n1++,t>>=1)
printf("%d",!!(v&t));
return 1;
}
int main(int argc,char *argv[]){
int n1,n2;
char value[10];
printf("Please enter value, n1 & n2(short 0<=n1<=n2<16)...\n");
if(scanf("%9s%d%d",value,&n1,&n2)!=3 || n1<0 || n2>15 || n2<n1 || !getbits(value,n1,n2)){
printf("Input error, exit...\n");
return 0;
}
printf("\n");
return 0;
}
运行样例:
展开全部
#include <stdio.h>
unsigned short getbits(unsigned short value,unsigned short n1,unsigned short n2)
{n1=16-n1; n2=16-n2; //从左数起转换为从右数起
return (value>>n2)&((1<<n1)-1); //先去掉右边的n2位,再与n1个1进行&
}
int main()
{unsigned short x,n1,n2;
scanf("%hd%hd%hd",&x,&n1,&n2);
printf("%hd\n",getbits(x,n1,n2));
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
unsigned short getbits(unsigned short value,int n1,int n2)
{
unsigned short temp=0;
int i;
for(i=n1;i<=n2;i++)
temp|=(value&(1<<(16-i)));
return temp
}
不理解的追问
望采纳 谢谢
{
unsigned short temp=0;
int i;
for(i=n1;i<=n2;i++)
temp|=(value&(1<<(16-i)));
return temp
}
不理解的追问
望采纳 谢谢
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询