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;
}