C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。尤其是计算机专业的学生,对其深痛恶绝,又爱又恨,但有些大神用起来确能信手拈来,妙手生花。下面是笔者在日常生活中常常遗忘的一些小技巧或者方法,作为汇总学习小记,与大家分享一下。
宏定义 #define
在程序代码中使用可以大大提高代码的可读性以及降低后续维护修改的成本和难度。
例如修改修改硬件电路的控制引脚,高低电平的持续时间,返回一些简单的运算或者比较大小。
//使用宏定义替代引脚定义
#define BEEP P2^0
//常用C51引脚定义
sbit BEEP = P2^0;
//使用宏完成固定值的定义
#define High_level 200
#define Low_level 10
//使用进行求平方运算
#define square(x) ((x)*(x))
void main()
{
int a;
a=5; //对a赋初值
printf("%d的平方值为%d \r\n",a,sqare(a));
}
//使用宏比较两个值的大小
#define max(a,b) ((a)>(b)?(a):(b))
void main()
{
int a,b;
a=5; //对a赋初值
b=7; //对b赋初值
printf("%d %d 两个数中比较大的是%d \r\n",a,b,max(a,b));
}
以上为简单的数组运算或者定值,宏定义也可以完成一些位运算操作
/***********************************************
常用逻辑运算符
& —与运算—当两个位同时为1的时候,才为1
| —或运算—当两个位同时为0的时候,才为0
^ —异或—两个位相同为0,相异为1
~ —取反—0取反为1,1取反为0
<< —左移—高位遗弃,地位补0
>> —右移—对无符号数,高位补0;
***********************************************/
#define GET_BIT(value,bit) ((value)&(1<<(bit))) //读取指定位
#define CPL_BIT(value,bit) ((value)^=(1<<(bit))) //取反指定位
#define SET0_BIT(value,bit) ((value)&=~(1<<(bit))) //把某个位置0
#define SET1_BIT(value,bit) ((value)|= (1<<(bit))) //把某个位置1
//使用宏修改函数或代码
#define value
#ifndef value
代码段1 或者 需要执行的代码2
#else
代码段2 或者 需要执行的代码2
#endif
当然在一些时候还能用一些位运算处理完成一些复杂的运算过程,以下用 x60作为示例。
//常规使用*乘法运算符号完成 ax60操作
void main()
{
int a;
a=123; //赋予初始化值
a=a*60; //常用的乘法运算
printf("a*60=%d \r\n",a);
}
//在单片机中这会耗费大量时间,且RAM不足时容易溢出导致出错
//优化后处理方式如下
/*********************************
a=a*60
=a*(4*15)
=a*(4*(16-1))
=a*4*16 - a*4*1
=(a<<2)<<4 - (a<<2)
=a<<6-a<<2
*********************************/
//使用位操作运算符号完成 ax60操作
void main()
{
int a;
a=123; //赋予初始化值
a=(a<<6)-(a<<2); //常用的乘法运算
printf("a*60=%d \r\n",a);
}