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

二进制逆序(字节反转)

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

  理论分析  

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

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

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

【源单单号】【源单类型】字段,在序时簿表头过滤条件里选不到

问题描述:自定义BOS单据,发布到主控台后,增加的【源单单号】【源单类型】,在过滤条件里选择不到这个字段解决方案:【重要提示】:请先在备份账套,根据相关单据修改下面SQL语句后,执行生效后,再在正式账套执行。--根据单据名称,在ICClassType表里查出需要在过滤界面显示源单类型和源单编号字段的...

Word通配符全攻略

Normal 0 7.8 磅 0 2 什么是WORD通配符?通配符是配合WORD查找、替换文档内容的有利武器。打开WORD,按Ctrl+F,点击&ldq...

tenx(十速)TM87系列常用宏(一)

tenx(十速)TM87系列常用宏(一) 首先,定义一些寄存器,用于存储临时变量,定义R0到R7为70H~77H,方便LCD显示。定义如下:ORG 70HR0 DN 1R1 DN 1R2 DN 1R3 DN 1R4 DN 1R5 DN 1R6 DN 1R7 DN 1由于累加器AC和状态寄存...

如何从远程桌面复制文件

如何从远程桌面复制文件

工作学习中,经常需要用到远程桌面,远程桌面确实很方便,但每次要将本地的东西拷贝到远程电脑或将远程电脑上的东西拷贝到本地时,都是用U盘来传递文件,这样就相当不方便了。近日,偶然看了远程桌面的帮助,发现其本身就是带文件复制、粘贴功能的,只是默认没有开启而已。 第一步:在远程桌面连接窗口,单击【选项】,...

关于数码管动态扫描

大家知道驱动一个或者两三个数码管,如果单片机有足够的IO口,我们可以用静态显示,至于什么是静态显示(动态显示的基础),这里不做阐述。 但如果,或者假如我们要点亮8个数码管或者更多,而恰恰单片机IO口不够用的情况下(扩展IO口的不讲),这是就必须用到动态扫描的显示方式了。 什么是数码管动态扫描?所谓...

Altium原理图update到PCB时某些元件老是自动先删除后添加

Altium原理图update到PCB时某些元件老是自动先删除后添加

现象:从原理图update到PCB时,明明原理图没有变更,但是某些元件老是被自动删除,然后又自动添加进去了,于是PCB里摆好的元件又到了右下角了,导致又要重新摆放元件。 如下图所示,C1~C21先是被remove了,然后又被add了。看起来没什么大碍,但是PCB上之前被摆放好的C1~C21又被自动放...

评论列表

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

原来,如此

发表评论

访客

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