Chinaunix首页 | 论坛 | 博客
  • 博客访问: 818085
  • 博文数量: 756
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 4980
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:40
文章分类

全部博文(756)

文章存档

2011年(1)

2008年(755)

我的朋友

分类:

2008-10-13 16:14:31

Big Endian和Little Endian的转换过程中需要交换高低字节。

偶们一般是怎么处理的呢?举个简单的例子:

typedef unsigned char BYTE;
typedef unsigned short WORD;
#define BYTE_LENGTH 8
WORD var_test, var_result;
BYTE high, low;

high = (var_test & 0xFF00) >> BYTE_LENGTH;
low  = var_test & 0x00FF;

var_result = ( low << BYTE_LENGTH ) | high;

这是最基本的做法,也是最保险的做法。那么Hack技巧是什么?请看:

var_result = (var_test << BYTE_LENGTH ) | ( var_test >> BYTE_LENGTH );

是不是又简洁,又好记,还不容易写错?^_^

当然,这是建立在C编译器会在移位的空位上自动补0的基础上的。如果C编译器不自动补0,那可就难说了。不过,偶还没有见过不自动补0的C编译器,如果你见到过,请告诉偶呀!:)

-----------------------------------------------------
2005-04-08     关于移位补位的说明

以下摘自Andrew Koenig的 《C Traps and Pit falls 》(中文版《C陷阱与缺陷》):
在向右移位时,空出的位是由0填充,还是由符号位的副本填充?
如果移位的对象是无符号数,那么空出的位将被0填充。如果被移位的对象是有符号数,那么C语言的实现既可以用0填充空出的位,也可以用符号位的副本填充空出的位。编程者如果关注向右移位时空出的位,那么可以将操作数的变量声明为无符号类型,那么空出的位都会被设置为0。


----------- VERSION HISTORY -----------------
2005-03-25      修改了rovershen提出的2处笔误。:)
2005-04-08      明确了所有移位变量为unsigned的类型,添加了Andrew对移位部位的观点。


--------------------next---------------------

阅读(690) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~