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 invertreturn 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