—-想了解C 语言常用方法技巧分享的全部内容且更多的C语言教程关注<计算机技术网(www.ctvol.com)!!>
C语言常用方法技巧
除法向上取整
#define DIV_ROUND_UP(n, d) (((n)+(d)-1) / (d))
大端小端选择
low-endian or high-endian
typedef union { short W; /* Word access */ struct { /* Byte access */ #ifdef LOW_ENDIAN byte low, high; /* in low-endian arch */ #else byte high, low; /* in high-endian arch */ #endif } B; } word;
求余数运算
a = a % 8; => a = a & 7;
说明:位运算只需一个指令周期;取余通常需要调用子程序。
平方运算
a = pow(a, 2.0); => a = a * a;
说明:内置乘法运算器的处理器中,乘法运算比求平方运算更快;即使没有内置乘法运算器,乘法运算的子程序也比平方运算子程序效率高。
移位实现乘除法运算
a = a * 4; b = b / 4; => a = a << 2; b = b >> 2;
说明:通常乘以或者除以2n,可使用移位方法代替。
a = a * 9; => a = (a << 3) + a;
while 循环和 do…while 循环
说明:do…while 循环编译后生成的代码长度短于 while 循环。
重定义类型,扩展移植性
typedef unsigned char boolean; /* Boolean value type. */ typedef unsigned long int uint32; /* Unsigned 32 bit value */ typedef unsigned short uint16; /* Unsigned 16 bit value */ typedef unsigned char uint8; /* Unsigned 8 bit value */ typedef signed long int int32; /* Signed 32 bit value */ typedef signed short int16; /* Signed 16 bit value */ typedef signed char int8; /* Signed 8 bit value */
得到指定地址上的一个字节或字
typedef unsigned char byte; /* Unsigned 8 bit value type */ typedef unsigned short word; /* Unsigned 16 bit value type */ #define MEM_B(x) (*((byte*)(x))) #define MEM_W(x) (*((word*)(x)))
求取极值
#define MAX(x, y) ((x) > (y) ? (x) : (y)) #define MIN(x, y) ((x) < (y) ? (x) : (y))
得到一个 field 在结构体(struct)中的偏移量
typedef unsigned long dword; /* Unsigned 32 bit value type */ #define FPOS(type, field) ( (dword)&((type*)0)->field )
得到一个结构体中 field 所占用的字节数
#define FSIZE(type, field) ( sizeof(((type*)0)->field) )
按照 LSB 格式把一个 word(16 bit) 转换成两个字节
#define FLOPW(ray, val) do { (ray)[0] = ((val)>>8); (ray)[1] = ((val)&0xFF); }while(0);
得到一个变量的地址
typedef unsigned char byte; /* Unsigned 8 bit value type */ typedef unsigned short word; /* Unsigned 16 bit value type */ #define B_PTR(var) ((byte*)(void*)&(var)) #define W_PTR(var) ((word*)(void*)&(var))
得到一个字节的低位和高位
typedef unsigned char byte; /* Unsigned 8 bit value type */ typedef unsigned short word; /* Unsigned 16 bit value type */ #define WORD_L(var) ((byte)(word)(var)&(0xFF)) #define WORD_H(var) ((byte)(word)(var)>>(8))
返回一个比 X 大的接近 8 的倍数
#define RND8(x) ((((x) + 7) >> 3) << 3)
防止溢出的方法
#define INC_SAT(val) ((val) = ( ((val) + 1) > (val)) ? ((val) + 1):(val) )
返回数组元素的个数
#define ARR_SIZE(a) ( (sizeof(a)) / (sizeof(a[0])) )
返回一个无符号数的后 n 位数
typedef unsigned long dword; /* Unsigned 32 bit value type */ #define MOD_BY_POWER_OF_TWO(val, mod_by) ((dword)(val)&(dword)(2<<(mod_by) - 1))
IO 空间映射在存储空间中的结构
typedef unsigned char byte; /* Unsigned 8 bit value type */ typedef unsigned short word; /* Unsigned 16 bit value type */ typedef unsigned long dword; /* Unsigned 32 bit value type */ #define outp(port) (*((volatile byte *)(port))) #define outpw(port) (*((volatile word *)(port))) #define outpdw(port) (*((volatile dword *)(port))) #define inp(port, val) (*((volatile byte *)(port))) = (byte)(val) #define inpw(port, val) (*((volatile word *)(port))) = (word)(val) #define inpdw(port, val) (*((volatile dword *)(port))) = (dword)(val)
宏中 “#” 和 “##” 的用法
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/487910.html