1:指針加法 加1 是加單元1 單元的大小就是看指針指向數據類型的大小
2;數組名 首元素的地址 則爲指向首元素的指針 則單元大小爲 首元素大小
&數組名 數組名的地址 則表示整個數組的首地址 則單元大小爲整個數組大小
3;宏定義與自加自減不能混爲一談
4;數據類型範圍問題造成的死循環
unsigned char 無符號字符類型範圍 0~255
char 有符號字符型 表示範圍爲-128~127
5:一語句實現x是否爲2 的若干次冪的判斷。
先是要知道 2的好多次冪 聯繫到 左移好多位 就是乘以2的多少次冪
左移那麼就意味着補的都是0;
若 i i-1進行& 是不是就可以知道了
-1那麼就意味着後面所有的0都要變成1 知道遇到1 才停止借位;
假設 2的5次冪 = 2 的一次冪 * 2的5次冪 = 10 <<5 結果就是1000000;
減1 0111111;
進行& = 0 則表示爲2的n次冪
2的n次冪也可以這樣解釋
printf(“%c”,(a)&(a-1)?’n’:’y’);
6;在嵌入式c中怎樣去獲取一個全1的數
答案是0進行取反 ~0即可
而不能用FFFF因爲你不知道要用多少個F去填補 因爲你不知道是多少位的硬件
評價下面的代碼片斷:
unsigned int zero = 0;
unsigned int compzero = ?0xFFFF;
/1‘s complement of zero /
【參考答案】對於一個int型不是16位的處理器爲說,上面的代碼是不正
確的。應編寫如下:
unsigned int compzero = ~0
引入一個問題 怎樣得到一個限定個數的1; 例如32位 我需要7個1 怎麼得到
答案依舊是0取反 然後加上移位 移位就意味着用0來補充
(~0)>>(32-(32-7))
要引入(32-(32-7))個0;
在位運算中有時還需要中間7個1 其餘全0的情況
那就是將上面得到的1 進行移位 移到中間去 ;
在位運算中有時還需要中間7個0 其餘全1的情況
那就是將上面移位完的1 進行取反 那麼就是中間爲0 一位1;
7;編寫strcpy 函數
char *strcpy(char *strDest,const char *strSrc);
注意是const類型 所以不能進行賦值再操作那種 可以直接進行對strSrc進行操作
#include <stdio.h>
#include <stdlib.h>
char *strcpy(char *strDest,const char *strSrc);
int main()
{
char str[20] = "linux love";
char des[30];
strcpy(des, str);
printf("%s\n",des);
}
char *strcpy(char *strDest,const char *strSrc)
{
char *pd = NULL;
pd = strDest;
while(*strSrc)
{
*pd++ = *strSrc++;
}
*pd = 0;注意一下 while 結束的標誌是遇到結束符0 那麼結束符還沒有被複制進去
return strDest;
}
8:二分查找
#include <stdio.h>
int binary_search(int* arr, int key, int n);
int main()
{
int a[10] = {1,2,3,4,5,6,7,8,10};
binary_search(a, 5, 10);
return 0;
}
int binary_search(int* arr, int key, int n)
{
int high = n-1, low = 0, mid, p = -1;
mid = (high+low)/2;
while(low <= high)
{
if(arr[mid] > key)
{
high = mid-1;
}
else if(arr[mid] < key)
{
low = mid +1;
}
else
{
p =mid;
printf("%d %d\n",mid, arr[mid]);
break;
}
mid = (low+high)/2;
}
return p;
}