二进制逆序(字节反转)

二进制逆序原文
CRC16算法原文

1 理论分析

二进制逆序,顾名思义就是将低位和高位交换,例如0x23 = 0010 0011 B,逆序后就是1100 0100 B。字节反转在“小端”格式和“大端”格式之间的数据转换是一个必要的操作。
一种比较笨的办法就是将字节里的每一位提取出来,再重新组合,这种方法较为耗费时间,对低端单片机而言极为不利。实际上通过与运算(&)和移位运算,可以轻松的做到这一点。
主要原理:先交换每相邻两位上的数,以后把互相交换过的数看成一个整体,继续进行以2位为单位的交换操作,之后以4为单位,以此类推。 以211= 11010011 B为例:

状态
1101001111010011<—原数
1 11 00 01 111100011<—第一次运算后
1 0 1 11 1 0 010111100<—第二次运算后
1 1 0 0 1 0 1 111001011<—第三次运算后

2 程序实现

/*   ****************************************************************/  
/**  
** @brief CRC校验函数
** @details 需要进行8位字节大小端逆序和,16位字节大小端逆序
** @note  
*/  
/*   ***************************************************************/  
unsigned int _CRC16(unsigned char *puchMsg, unsigned int usDataLen)  
{  
    unsigned int wCRCin = 0xFFFF;  
    unsigned int wCPoly = 0x1021;  
    unsigned char wChar = 0x0000;  

    while (usDataLen--)     
    {  
        wChar = *(puchMsg++); 

        /* 8位交换大小端 */ 
        /* InvertUint8(&wChar,&wChar); */
        // 交换每两位  
        wChar = ((wChar >> 1) & 0x55) | ((wChar & 0x55) << 1);  
        // 交换每四位中的前两位和后两位  
        wChar = ((wChar >> 2) & 0x33) | ((wChar & 0x33) << 2);  
        // 交换每八位中的前四位和后四位  
        wChar = ((wChar >> 4) & 0x0F) | ((wChar & 0x0F) << 4);

        wCRCin ^= (wChar << 8);  
        for(int i = 0;i < 8;i++)  
        {  
          if(wCRCin & 0x8000)  
            wCRCin = (wCRCin << 1) ^ wCPoly;  
          else  
            wCRCin = wCRCin << 1;  
        }  
    }

    /* 16位交换大小端 */
    /* InvertUint16(&wCRCin,&wCRCin); */
    // 交换每两位  
    wCRCin = ((wCRCin >> 1) & 0x5555) | ((wCRCin & 0x5555) << 1);  
    // 交换每四位中的前两位和后两位  
    wCRCin = ((wCRCin >> 2) & 0x3333) | ((wCRCin & 0x3333) << 2);  
    // 交换每八位中的前四位和后四位  
    wCRCin = ((wCRCin >> 4) & 0x0F0F) | ((wCRCin & 0x0F0F) << 4);  
    // 交换相邻的两个字节  
    wCRCin = ((wCRCin >> 8) & 0x00FF) | ((wCRCin & 0x00FF) << 8);  

    return (wCRCin);  
}  

3,博主注

可以把整个过程看出一个递归过程理解起来会容易很多,比如:

00111101先分成0011-1101两部分调换1101-0011
1101先分成11-01两部分调换01-11(0011同理)
01分成0-1调换成1-0(11同理)

可以用递归函数完成这个过程,但32位以内都是没有必要的。

  • 11
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java的十进制逆序数是指将一个十进制数的各个数字逆序排列后得到的新数。例如,123的逆序数为321。 以下是一种实现Java十进制逆序数的方法: ```java public static int reverse(int n) { int result = 0; while (n > 0) { result = result * 10 + n % 10; n /= 10; } return result; } ``` 这个方法首先将result初始化为0,然后通过不断地将n的个位数添加到result的末尾,来逐步构建出n的逆序数。具体来说,每次循环,先将result乘以10,然后将n对10取模得到个位数,将其加到result的末尾,最后将n除以10向下取整,以去掉已经处理过的个位数。当n变为0时,循环结束,result中存储的就是n的逆序数。 可以通过以下代码来测试该方法: ```java public static void main(String[] args) { int n = 123; int reversed = reverse(n); System.out.println(reversed); // 输出321 } ``` ### 回答2: Java的十进制逆序数是指将一个十进制数的各位数字逆序排列后得到的新数。 实现十进制逆序数的方法可以通过以下步骤: 1. 将给定的十进制数转换为字符串类型,方便进行字符串的逆序操作。 2. 使用StringBuilder或StringBuffer等字符串处理类,将字符串逆序排列。 3. 将逆序后的字符串转换回十进制数类型。 以下是一个示例代码实现: ``` public class DecimalReverseNumber { public static int reverseNumber(int number) { String numberStr = String.valueOf(number); // 将整数转换为字符串 StringBuilder reverseStr = new StringBuilder(numberStr).reverse(); // 将字符串逆序排列 String reverseNumberStr = reverseStr.toString(); // 将逆序后的字符串转换为普通字符串 int reverseNumber = Integer.parseInt(reverseNumberStr); // 将逆序后的字符串转换为整数 return reverseNumber; } public static void main(String[] args) { int number = 12345; int reverseNumber = reverseNumber(number); System.out.println("原始数:" + number); System.out.println("逆序数:" + reverseNumber); } } ``` 执行以上代码,将输出: 原始数:12345 逆序数:54321 这就是Java中实现十进制逆序数的一个简单示例。 ### 回答3: Java的十进制逆序数是指将一个整数的十进制表示中的数字逆序排列后得到的新整数。 实现这个功能可以按照以下步骤进行: 1. 将要逆序的整数转化为字符串类型。 2. 使用StringBuilder类的reverse()方法将字符串逆序。 3. 调用StringBuilder类的toString()方法,将逆序后的字符串转换为整数类型。 例如,对于整数12345,将其转化为字符串类型为"12345",然后使用StringBuilder类的reverse()方法将其逆序得到字符串"54321",最后再将其转化为整数类型得到54321。 下面是一个Java实现的示例代码: ``` public class ReverseDecimalNumber { public static void main(String[] args) { int number = 12345; String numberStr = String.valueOf(number); StringBuilder reversedNumberStr = new StringBuilder(numberStr).reverse(); int reversedNumber = Integer.parseInt(reversedNumberStr.toString()); System.out.println("原始数值:" + number); System.out.println("逆序数值:" + reversedNumber); } } ``` 以上代码输出的结果为: ``` 原始数值:12345 逆序数值:54321 ``` 这样就完成了整数的十进制逆序数的计算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值