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

二进制逆序(字节反转)

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

  理论分析  

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

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

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

OKI单片机-如何查看编译后的汇编代码

OKI单片机-如何查看编译后的汇编代码

使用OKI单片机时,有几种情况需要看汇编代码: 1、精确延时,这个用C基本上无法实现; 2、用汇编编程,但某部分程序用汇编写感觉有难度。此时先用C编写,然后查看其汇编代码,借鉴一二。 有两种方式可以看到编译后的汇编代码: 1、程序编译完成后,编译器自动生成各C文件的汇编代码 (1)能看到绝大部分汇编...

简易方波信号发生器

简易方波信号发生器

简易正弦波信号发生器这个是帮别人做的。方波信号发生器要求:(1)搭建硬件电路(2)设计软件,满足    ① 外部触发,可任意选择1KHz、100Hz、1Hz三种方波之一输出(示波器观察)    ② 延时方法包括软件延时和定时器两种方式&nb...

Altium 比较两个PCB的不同

Altium 比较两个PCB的不同

一般情况下,我们如果修改了PCB,都会标明大概修改了什么地方。但是有的时候,我们修改了PCB,却忘了标明改了什么地方,由于改动较小,过了一段时间之后,彻底忘了改了哪里。这时候要想知道改了哪里,该如何做? 首先,要说明的是,Altium本身的Compare功能是针对project自身的历史版本的(既可...

双击打开exe程序和Process.Start区别

问题:使用Process.Start打开.exe程序的时候发现在使用时无法加载启动路径的配置文件。启动代码:Process process = new Process();          &nbs...

OKI单片机——ML610Q4XX 捕获功能

OKI单片机——ML610Q4XX 捕获功能

捕获取得的值是正常的两倍。 配置步骤: 1.通过(P0CON1)设置引脚模式。 2.设置外部引脚中断控制寄存器EXICON1。 3.设置CAPCON寄存器的ECAP1位启动捕获通道1。 /***********************************************/ * @bri...

固定电容标称容量及误差

电容器上标有的电容数是电容器的标称容量。电容器的标称容量和它的实际容量会有误差。常用固定电容允许误差的等级见表1。 表1 固定电容允许误差等级 误差 ±2%...

评论列表

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

原来,如此

发表评论

访客

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