分类:
2008-10-13 16:14:31
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对移位部位的观点。