#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
解析:
~是位取反的意思。
_INTSIZEOF(n)整个做的事情就是将n的长度化为int长度的整数倍。
比如n为5,二进制就是101b,int长度为4,二进制为100b,那么n化为int长度的整数倍就应该为8。
~(sizeof(int) - 1) )就应该为~(4-1)=~(00000011b)=11111100b,这样任何数& ~(sizeof(int) - 1) )后最后两位肯定为0,就肯定是4的整数倍了。
(sizeof(n) + sizeof(int) - 1)就是将大于4m但小于等于4(m+1)的数提高到大于等于4(m+1)但小于4(m+2),这样再& ~(sizeof(int) - 1) )后就正好将原长度补齐到4的倍数了。
取一个数(len)除以4后的余数
len & 3;
把一个整数转化成一个地址
比如,地址 0x12ff 里面存放的是数是5,
然后定义了一个int *p;
想让p指向变量5,
如何才能让p存放的地址是0x12ff?
int *p=(int *)0x12ff;
break使用
在两层while(1)循环中,break只会跳出最里面那层while循环。
extern使用
extern 与函数
函数的声明和定义均可以不使用extern。
第一套方案(不使用头文件的方案)
A.C中定义一个函数fun():
int fun(void) //定义
{
return 0;
}
B.c中调用fun():
Int fun(void);//先声明
Int main()
{
Fun();//调用
}
或者可以有第二套方案(使用头文件的方案)
假设第一套方案中有B.c,C.c,D.c都要调用A.c中的fun(),总不能在每个.B~D.c文件中都声明一下吧,所以我们把这个声明写在头文件里,例如
A.h
Int fun(void);//声明
然后B~D.c中包含这个头文件,然后就可以调用了。
extern 与变量
//B.c调用A中的全局变量Num
A.c中
int Num=0;//定义Num,这里写成
extern int Num=0;也可以,写成
int Num;也可以,都是定义。
唯独不能写成 extern int Num;因为这是声明。
A.h中
extern int Num;//声明Num
B.c中
#include "A.h"
Num=1;//对Num进行操作
注:其实关注点不应该是extern,而应该是变量的声明与定义。定义一定要有,且只有一次,而声明可以多次,变量声明并非一定要头文件中,只是因为在头文件中可以被多个源文件包含(其实就是变相的多个源文件都声明这个变量)。
如果上述变量不使用头文件,则可以选择与上述的函数第二个方案一样,直接在要调用该变量的源文件中,即B.c中声明一下,即extern int Num;然后使用。
static使用
static在函数的声明与定义中,都需要注意,这个函数不能用在外部,不然会报错,其他的文件没有对这个函数的定义。
sprintf使用技巧(使用%.5s指定字符串长度为5,不管name长度有多少)
#include <stdio.h>
#include <stdlib.h>
int main()
{
char cmd[100];
char name[]="testforsprintf";
sprintf(cmd,"C:\\Users\\sunny\\Desktop\\%.5s.txt",name);
printf("cmd is %s\n",cmd);
FILE *file_t = fopen(cmd,"wb");
fwrite(name,1,sizeof(name),file_t);
fclose(file_t);
}
打印的结果:cmd is C:\Users\sunny\Desktop\testf.txt
生成的文件testf.txt打开后
testforsprintf
注意:testforsprintf后有一个空格。
将两个有序数组组合成一个有序数组。
例:将两个从小到大排序的数组col1和col2组合成一个从小到大的数组dest。
void mergeKernelColumns (const float *col1, const float *col2, unsigned int num1, unsigned int num2, float *dest)
{
unsigned int min_num = 0;
if(num1 <= num2)
{
min_num = num1;
}
else
{
min_num = num2;
}
unsigned i = 0, j = 0;
while (i < min_num && j < min_num)
{
*dest = col1[i] < col2[j] ? col1[i++] : col2[j++];
dest++;
}
for (; i < min_num; ++i, ++dest)
{
*dest = col1[i];
}
for (; j < min_num; ++j, ++dest)
{
*dest = col2[j];
}
}
NEON指令,哈希算法