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
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
number: 58 00000000000000000000000000111010