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

二进制逆序(字节反转)

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

  理论分析  

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

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

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

MEMS微电子机械系统

文章来源:http://www.memschina.com MEMS(Micro Electromechanical System,即微电子机械系统)是指集微型传感器、执行器以及信号处理和控制电路、接口电路、通信和电源于一体的微型机电系统。概括起来,MEMS具有以下几个基本特点,微型化、智能化、多...

Coreldraw批量导出图片

Coreldraw批量导出图片

问题: 多个Coreldraw(cdr)文件,需要导出jpg或png图片文件,但不想通过打开每个文件来导出。如何批量导出jpg或png图片文件?   解决办法: 网上有人说,采用宏的方式,但这个需要自己编写宏,对菜鸟来说太难;还有人说,给Coreldraw安装一个插件,但根本不知道用什么插...

惠斯通电桥

惠斯通电桥

1、惠斯通电桥简介 惠斯通电桥(Wheatstone Bridge),是测量电阻值的一种四臂电桥,被测电阻为一个臂,其余三个臂是已知标准电阻,其中至少有一个臂是可调的。 惠斯通电桥并不是惠斯通发明的,而是由英国发明家克里斯蒂于1833年发明的,但是由于惠斯通第一个用它来测量电阻,所以人们习惯上就...

Multisim几则使用技巧

Multisim几则使用技巧

  Multisim是加拿大图像交互技术公司(Interactive Image Technoligics简称IIT公司)推出的以Windows为基础的仿真工具,适用于板级的模拟/数字电路板的设计工作。它包含了电路原理图的图形输入、电路硬件描述语言输入方式,具有丰富的仿真分析能力。 这两天...

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

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

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

51串口通信

51串口通信

大学的时候,练习串口通信整的东东图太大,显示不正常。请直接看原图。upload/2010/1/201001291823133003.jpg演示如图: 左边的单片机:发送  查询方式右边的单片机:接收    中断方式K1:LED1亮;K2:LED2亮;...

评论列表

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

原来,如此

发表评论

访客

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