当前位置:首页 > 技术心得 > 正文内容

二进制逆序(字节反转)

xjtudll13年前 (2013-09-23)技术心得55871

  理论分析  

二进制逆序,顾名思义就是将低位和高位交换,例如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

扫描二维码推送至手机访问。

版权声明:本文由鸟的天空发布,如需转载请注明出处。

本文链接:http://xjtudll.cn/Exp/283/

标签: 算法单片机
分享给朋友:

“二进制逆序(字节反转)” 的相关文章

php环境如何测试是否配置成功

<?php phpinfo(); ?> 编写一个PHP文件(注意:是PHP文件,不是txt文件),里面内容如上。 浏览器里访问这个文件。如果能看到配置信息,表明PHP环境配置成功。...

MSP430 fail to initialize device解决

MSP430 fail to initialize device解决

日前,在用MSP430 USB仿真器下载程序的时候,突然提示“fail to initialize device”,碰到这个问题,我的第一反应就是检查下载线与单片机是否连接正确,仔细检查了一遍连线,发现连接无误,但是就是每次都提示“fail to initialize device”,然后无法...

Altium如何增加机械层

Altium如何增加机械层

Altium的机械层(Mechanical),默认只有一层,想多加几层吧,发现与Protel99SE大不相同,折腾了半天,总算是搞定了。 增加机械层步骤如下(以英文版为例,中文版大同小异): 1、在PCB界面,按L键(需先切换到英文输入法),弹出了板层配置的窗口。如图所示。 去掉【Only sho...

12点是AM还是PM

12点是AM还是PM

中午12点是AM还是PM,有很多人会搞混。有说是AM的,也有说是PM的。 先说说AM和PM的含义吧 AM:ante meridiem(来自拉丁文) PM:post meridiem(来自拉丁文) 那么12点究竟是AM还是PM呢?一般习惯说中午十二点为12 PM, 深夜十二点为12 AM,正式用法是&...

运放平衡电阻的作用

运放平衡电阻的作用

运放输入端所接电阻要平衡,目的是使集成运放两输入端的对地直流电阻相等,运放的偏置电流不会产生附加的失调电压。但有些电路对失调电压要求并不高,例如交流音频放大器。有些运放偏置电流很小,即使输入端电阻不平衡也不会对失调电压产生什么影响,这些电路就可以不要求输入端电阻平衡。 以反相放大器来说明平衡电阻的...

在水晶报表中使用Code128条形码

在水晶报表中使用Code128条形码

核心重点:字符串如果直接用code128字体显示,是无法扫描出来的。 1.将code128条码字体拷贝到C:\Windows\fonts下 2 .在水晶报表里的【字段资源管理器】的【公式字段】中新建一个公式字段例如我命名为Code128 3.在新建的字段单击鼠标右键 选择编辑 在报表自定义函数中新建...

评论列表

小易
小易 IP:
13年前 (2013-09-23)

原来,如此

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。