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

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

合并2 字节的写法

[复制链接]
跳转到指定楼层
1#
发表于 2009-4-18 18:02:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
很多时候需要把 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 11:07 , Processed in 0.051157 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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