英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流

标题: 合并2 字节的写法 [打印本页]

作者: kingman    时间: 2009-4-18 18:02
标题: 合并2 字节的写法
很多时候需要把 2 个CHAR 合并成INT,把一个INT 分解成2 个CHAR。
C 语言中实现这样的功能有很多写法
例子:
把 2 个CHAR 类型A,B 合并成一个INT 类型的C。要求B 占C 的低8 位,A 去掉最高位后(即A 整体左移动1 位后)占C 的高8 位。
CHIPCON 公司的CC1020 的驱动源码是这样的,我们来看看:
char a,b;
int c;
c=(int) (a&0x7F)<<9 | (int) b &0x00FF;
用起来是没任何问题的,但是有画蛇添足之嫌。
原因:
a&0x7F 是去掉最高位,但是不要忘了后面还有整体左移9 位的运算。整体左移的运算就自
动抛弃了a 的最高位,所以a&0x7F 可以完全不要。
后面的 b &0x00FF 也可以不要,因为b 本来就要全部保留,并且b 本身就没有高8 位。
代码可以改成:
c=(int) (a)<<9 | (int) b;
可以省代码量。
但是这样的代码还是不爽,因为编译器不够智能,它不清楚<<9 可以分解成<<1 后再<<8,
<<1 和<<8 这样的运算是很省代码,而且非常之快的。
于是代码又可以改成:
c=(((int) (a)<<1)<<8) | (int) b;
空间和速度有优化了很多。
但是还有最优化的方案,就是用 C 的共同体,尤其对于A、B、C 都是局部变量的情况下。
union cyp{
int INT_data;
char CHAR_data[2];
};
union cyp val;
val.CHAR_data[0]=b; //b 直接赋给低8 位
val.CHAR_data[1]=a<<1; //a 左移动一位后直接赋给高8 位
c=val.INT_data;
这样的代码是最优化的,最小的空间,最快的速度。




欢迎光临 英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 (http://www.enroobbs.com/) Powered by Discuz! X3.2