winnie 发表于 2009-4-25 15:47:17

举例说说合并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;
};
union cyp val;
val.CHAR_data=b;                  //b直接赋给低8位
val.CHAR_data=a<<1;            //a左移动一位后直接赋给高8位
c=val.INT_data;                        
这样的代码是最优化的,最小的空间,最快的速度。
页: [1]
查看完整版本: 举例说说合并2字节的写法。