二进制逆序(字节反转)
1 理论分析
二进制逆序,顾名思义就是将低位和高位交换,例如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 程序实现
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 ;//R0,R1存储变换第一次的值
ANDI* R0,0011B
SL0 R0
SL0 R0
ANDI* R1,1100B
SR0 R1
SR0 R1
OR* R0
RTS