思科笔试-嵌入式底层C

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



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值