二进制逆序(字节反转)

1

本文作者:xjtudll  发布于:2013-9-23  分类:技术心得  点击:


  理论分析  

二进制逆序,顾名思义就是将低位和高位交换,例如0x23 = 0010 0011 B,逆序后就是1100 0100 B。字节反转在“小端”格式和“大端”格式之间的数据转换是一个必要的操作。

一种比较笨的办法就是将字节里的每一位提取出来,再重新组合,这种方法较为耗费时间,对低端单片机而言极为不利。实际上通过与运算(&)和移位运算,可以轻松的做到这一点。

主要原理:先交换每相邻两位上的数,以后把互相交换过的数看成一个整体,继续进行以2位为单位的交换操作,之后以4为单位,以此类推。

211= 11010011 B为例:

+---+---+---+---+---+---+---+---+

| 1 | 1 | 0 | 1 | 0 | 0 | 1 | 1 |           <---原数

+---+---+---+---+---+---+---+---+

|  1 1  |  1 0  |  0 0  |  1 1  |   <---第一次运算后

+-------+-------+-------+-------+

|    1 0 1 1    |    1 1 0 0    |   <---第二次运算后

+---------------+---------------+

|        1 1 0 0 1 0 1 1        |   <---第三次运算后

+-------------------------------+

  程序实现  
   2.1 C语言代码  

/*

 ****************************************************************/

/**

** @brief 二进制逆序

** @details 将一个数的高低位交换例如00111001B转成10011100B

** @param[in,out] *s -uchar,需要逆序的数据

** @note

*/

***************************************************************/

void VLBinSwap(uchar *s)

{

 uchar temp1,temp2,temp3;

temp1 = ((*s)&0x55)<<1;

temp2 = ((*s)&0xAA)>>1;

 temp3 = (temp1|temp2);

temp1 = (temp3&0x33)<<2;

 temp2 = (temp3&0xCC)>>2;

temp3 = (temp1|temp2);

 temp1 = (temp3&0x0F)<<4;

 temp2 = (temp3&0xF0)>>4;

 (*s) = (temp1|temp2);

}

2.2 tenx汇编代码

tenx(十速)是四位机,所以举例是4bits交换。

;////////////////////////////////////////////////////////////////

;Function: 交换二进制高低位

;Description: 占用寄存器R1,R0

; Example1:  0010->0100

; Example2:  1100->0011

;Input: R0

;Output: R0(转换后)

;//////////////////////////////////

;//调用示例

; CALL gSysBINSwap

;------------------------------

gSysBINSwap:

MRW R1,R0

ANDI* R0,0101B

SL0 R0

ANDI* R1,1010B

SR0 R1

OR* R0 ;//R0 OR R1

MRW R1,R0 ;//R0R1存储变换第一次的值

ANDI* R0,0011B

SL0 R0

SL0 R0

ANDI* R1,1100B

SR0 R1

SR0 R1 

OR* R0

  RTS

本文标签: 算法  单片机  
本文Url: http://www.xjtudll.cn/Exp/283/ (出自: 鸟的天空)
我要引用: 点击这里获取该日志的TrackBack引用地址

相关文章:

280. 单片机IO输入输出配置  (2013-8-11 13:32:41)

279. OKI单片机使用注意事项  (2013-7-20 11:4:59)

272. OKI DSR警告解决  (2013-6-17 9:25:22)

271. I2C协议简单分析  (2013-6-13 15:57:48)

267. Altium Drag妙用——批量添加引脚(PIN)延长导线  (2013-4-20 15:51:27)

261. Cool Edit Pro生成周期性方波  (2013-2-10 16:30:47)

260. OKI单片机调试时如何修改变量值  (2013-2-6 8:12:44)

259. OKI单片机-如何查看编译后的汇编代码  (2013-2-3 17:36:25)

258. OKI单片机-如何查看编译后程序占用的RAM和ROM大小  (2013-1-31 15:22:42)

257. ML610Q473 程序烧录  (2013-1-28 19:21:54)

1 Comments

Write a comment ?