C语言如何实现字节高低位互换?

发布时间:2024-10-04 11:52:22  
问题
对一个字节数据,逐个交换其高低位,例如11010001,经过0-7,1-6,2-5,3-4对应位的交换,变成10001011 。 嵌入式资料包"> 【付费】STM32嵌入式资料包

解决思路

对于该问题,我们最先想到的是对原字节通过移位操作来逐位处理,使用另一个变量来存储交换后的结果。这种解决方案处理起来思路清晰,编写代码应该不难。
下面是该思路对应的代码:
 unsigned char shift_fun1(unsigned char data)   {       unsigned char i;       unsigned char tmp=0x00;        for(i=0;i<8;i++)       {           tmp=((data>>i)&0x01)|tmp;           if(i<7)              tmp=tmp<<1;       }       printf("  after shift fun1 data=%x 
",tmp);  
     return tmp;  
上述代码实现起来不难,而且效率还是比较高的。但是还有比这更简洁的解决方法,在嵌入式开发中遇到交换字节位的问题时通常使用蝶式交换法和查表法来实现。
查表法顾名思义即将一些值存到内存中,需要计算时查表即可,但是也会占用额外的存储空间。这里主要再介绍一下蝶式交换法。
所谓的蝶式交换是这样的:
data=(data<<4)|(data>>4);  data=((data<<2)&0xcc)|((data>>2)&0x33);  data=((data<<1)&0xaa)|((data>>1)&0x55); 
我们可以做一下执行演算:
假设原始位序列为 0 1 0 1 1 0 0 1
data=(data<<4)|(data>>4);之后序列为 1 0 0 1 0 1 0 1
data=((data<<2)&0xcc)|((data>>2)&0x33); 之后序列为 0 1 1 0 0 1 0 1
data=((data<<1)&0xaa)|((data>>1)&0x55); 之后序列为1 0 0 1 1 0 1 0
更抽象的来说,原始位为1 2 3 4 5 6 7 8 data=(data<<4)|(data>>4); 之后位序为5 6 7 8 1 2 3 4
data=((data<<2)&0xcc)|((data>>2)&0x33); 之后位序为 7 8 5 6 3 4 1 2
data=((data<<1)&0xaa)|((data>>1)&0x55);之后位序为 8 7 6 5 4 3 2 1

由此完成了整个位的逆序转换,下面是具体的实现代码:
unsigned char shift_fun2(unsigned char data)  {      data=(data<<4)|(data>>4);      data=((data<<2)&0xcc)|((data>>2)&0x33);      data=((data<<1)&0xaa)|((data>>1)&0x55);      printf("  after shift fun2 data=%x 
",data);  
return data; }

文章来源于:单片机与嵌入式    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    C语言如何实现字节高低位互换?; 问题 对一个字节数据,逐个交换其高低位,例如11010001,经过0-7,1-6,2-5,3-4......
    过软件改变Rx和Tx引脚、电平反转、高低反序、介绍超时等。 支持RXD和TXD管脚互换 有些时候,我们在外接RS232芯片时,可能会将RXD和TXD两根线接反。这类低级错误,一般是老司机才会犯。 如果......
    制 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //不知有啥用 //定义波特率预分频的值:波特率预分频值为8 SPI_InitStructure.SPI_BaudRatePrescaler......
    【STM32学习笔记】USART 新特性;支持RXD和TXD管脚互换 很多时候,我们在外接RS232芯片时,很容易将RXD和TXD两根线接反。这类低级错误,一般是老司机才会犯。如果大家知道USART......
    下这个指针指向的地址 while(1) { } } 那些规定C语言的大佬弄出来指针这个玩意有啥用? 3、指针有啥用?1.咱先使用下指针,然后具体有啥用就自己体会了。前面咱把一个变量的地址赋值给了指针了,然后搞C......
    设置1,相当于仪表校准标定清除,实际液位高于探头位置,设置1#参数0为1,点确认;实际液位低于探头位置,设置2#参数0为1,点确认。 2)双点开关,3#6#参数设置1,相当于高低位......
    ,Rn   5. XCHD:(半字节交换指令): 格式(目的:源) A :@Ri(这个指令比较奇葩,只能操作@Ri,是把Ri的内容指向的内存的低四位和A的低四位互换)   6. SWAP:(自交......
    按键松手检测(只有当按键松开时矩阵连接的管脚高位和低位才会互换继续检测行。否则进行循环延迟)         {                 delay(100......
    a         ;a的内容循环右移     rlc a        ;a的内容和进位位一起左移     rrc a        ;a的内容和进位位一起右移     swap a       ;a的低四位与高四位互换......
    低位:CRC校验码 CRC 高位:CRC校验码 帧尾:3.5个字节的通讯时间 在变频器的控制器,功能码主要用到两个03H和06H。 03H......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>