您的位置:首页 > 其它

思科笔试-嵌入式底层C

2012-10-22 22:05 274 查看
1. 用宏定义写出swap(x,y)(考宏的使用吧,嵌入式系统中宏的使用还是很多的,特别是对I/O口的命名时,有时还是有点小复杂)

#include "stdio.h"
#define SWAP1(x,y) {x=x+y;y=x-y;x=x-y;}
#define SWAP2(x,y) {x^=y^=x^=y;}
#define SWAP3(t,x,y){t temp;temp=x;x=y;y=temp;}

int main(int argc, char const *argv[])
{
int a=2,b=3;
printf("a=%d,b=%d\n",a,b );
SWAP1(a,b);
printf("a=%d,b=%d\n",a,b );
SWAP2(a,b);
printf("a=%d,b=%d\n",a,b );
SWAP3(int,a,b);
printf("a=%d,b=%d\n",a,b );
return 0;
}
Result:

a=2,b=3

a=3,b=2

a=2,b=3

a=3,b=2

2.数组a
,存放了1至N-1个数,其中某个数重复一次。写一个函数,找出被重复的数字.时间复杂度必须为o(N)函数原型:int do_dup(int a[],int N)

/*
数组a
,存放了1至N-1个数,其中某个数重复一次。写一个函数,找出被重复的数字.
时间复杂度必须为o(N)函数原型:int do_dup(int a[],int n);
*/
#include "stdio.h"

int do_dup(int a[],int N);

int main(int argc, char const *argv[])
{
const int N=100;
int a
;
a[N-1]=9;           //测试用,分辨函数与你的位置无关
for (int i = 0; i < N-1; i++)
{
a[i]=i+1;
}
printf("%d \n",do_dup(a,N) );

return 0;
}

int do_dup(int a[],int N)
{
int sum=0;
float sum2;
for (int i = 0; i < N; i++)
{
sum+=a[i];
}
sum2=(1.0+N-1)*(N-1)/2;
return (int)(sum-sum2);
}


Result:

9
ps:个人觉得题意有点坑~~~

3 一语句实现x是否为2的若干次幂的判断

#include "stdio.h"

int main(void)
{
int b=16;

printf("%s\n",(b&(b-1)?"false":"ture") );
return 0;
}
Result:

ture

4.unsigned int intvert(unsigned int x,int p,int n);
实现对x的进行转换,p为起始转化位,n为需要转换的长度,假设起始点在右边.如x=0b0001 0001,p=4,n=3转换后x=0b0110 0001.(这个对寄存器的操作~~~)

#include "stdio.h"
unsigned int intvert(unsigned int x,int p,int n);
void printB(int i);

int main(void)
{
int b=0b11000101;

printB(b);
printB(intvert(b,0,8));//all invert
return 0;
}
unsigned int intvert(unsigned int x,int p,int n)
{
return x^=(((1<<n)-1)<<p);//(1<<n)-1 to get n 1 is so smart.
}

/*打印二进制位的函数*/

void printB(int i)
{
printf("number:%4d  " ,i);
int a;
for( a = 31; a >=0; a--)
{
int k = (i >>a) &1;    //有些符号位可能会是1
printf("%d" ,k);
}
printf("\n");
}
Result:

number: 197  00000000000000000000000011000101

number:  58  00000000000000000000000000111010

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: