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

 找回密码
 立即注册
搜索
电子烟方案单片机单片机开发深圳单片机开发
单片机方案国产单片机8位单片机电子烟方案开发
查看: 3951|回复: 0
打印 上一主题 下一主题

举例说说合并2字节的写法。

[复制链接]
跳转到指定楼层
1#
发表于 2009-4-25 15:47:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
很多时候需要把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;                        
这样的代码是最优化的,最小的空间,最快的速度。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|公司首页|Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 ( 粤ICP备09008620号 )

GMT+8, 2024-12-25 10:15 , Processed in 0.051767 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表