1.求余运算 a="a"%8; 可以改为: a="a"&7;
说明:位操作只需一个指令周期即可完成,而大部分的 C 编译器的“ % ”运算均
是调用子程序来完成,代码长、执行速度慢。通常, 只要求是求 2n 方的余数,
均可使用位操作的方法来代替。
2.用移位实现乘除法运算 a="a"*4; b="b/4"; 可以改为: a="a"<<2; b="b">>2; 通
常如果需要乘以或除以 2n ,都可以用移位的方法代替。
旧代码 : x = w % 8; y = pow(x , 2.0); z = y * 33; for (i = 0;i < MAX;i++) { h = 14 *
i; printf("%d" , h); }
新代码 : x = w & 7; /* 位操作比求余运算快 */ y = x * x; /* 乘法比平方运算快 */ z
= (y << 5) + y; /* 位移乘法比乘法快 */ for (i = h = 0; i < MAX; i++) { h += 14; /*
加法比乘法快 */ printf("%d" , h); }
3 .延 时 函 数 通 常 使 用的 延 时 函 数 均采 用 自 加 的 形式 : void delay (void)
{ unsigned int i; for (i=0;i<1000;i++) ; } 将其改为自减延时函数: void delay (void)
{ unsigned int i; for (i=1000;i>0;i--) ; }
两个函数的延时效果相似,但几乎所有的 C 编译对后一种函数生成的代码均比
前一种代码少 1~3 个字节,因为 几乎所有的 MCU 均有为 0 转移的指令 ,采用
后一种方式能够生成这类指令。
4.while 循环和 do…while 循环 用 while 循环时有以下两种循环形式: unsigned
int i; i="0"; while (i<1000) { i++; // 用户程序 } 或: unsigned int i; i="1000"; do
{ i--; // 用户程序 } while (i>0); 在这两种循环中, 使用 do … while 循环编译后生
成的代码的长度短于 while 循环。
5.循环转置 有些机器对 JNZ( 为 0 转移 ) 有特别的指令处理,速度非常快,如
果你的循环对方向不敏感,可以由大向小循环。旧代码 : for (i = 1; i <= MAX; i+
+) { 。。。 } 新代码 : i = MAX+1; while (--i) { 。。。 }
6.选择好的无限循环 在编程中,我们常常需要用到无限循环,常用的两种方
法是 while (1) 和 for ( ;; ) 。这两种方法效果完全一样,但那一种更好呢?然
我们看看它们编译后的代码:编译前: while (1) ;编译后: mov eax , 1 test
eax , eax je foo+23h jmp foo+18h 编译 前 : for ( ; ; ) ; 编译 后 : jmp
foo+23h 显然, for ( ;; ) 指令少,不占用寄存器,而且没有判断、跳转,比
评论7