16bit数据高低8位交换的4种实现方法

/********************************************************* 
 *CopyRight @piaoxiang.zhang
 *******************************************************/
#include <stdio.h>

#define SWH_16(arg) swap_half_16_##arg
#define funVar(xxx) printf( "%s initial data is:\n", #xxx )

typedef union {
   uint8_t AL[2]; 
   uint16_t AX;
}UC_16_t;

void swap_half_16_1st(uint16_t *in,int len)
{
   printf("\n%s start:\n",__func__) ;
   UC_16_t *tmp=(UC_16_t *)in;
   uint8_t t;
   int i;

   for(i=0;i<len;i++)
   {
      t=tmp->AL[0];
      tmp->AL[0]=tmp->AL[1];
      tmp->AL[1]=t;
      tmp++;
   }
}

void swap_half_16_2nd(uint16_t *in,int len)
{
  printf("\n%s start:\n",__func__) ;
  uint8_t *tmp=(uint8_t *)in,t;
  int i;

  for(i=0;i<len*2;i+=2)
  {
    t=tmp[i];
    tmp[i]=tmp[i+1];
    tmp[i+1]=t;  
  }
}

void swap_half_16_3rd(uint16_t *in,int len)
{
  printf("\n%s start:\n",__func__) ;
  int i;

  for(i=0;i<len;i++)
  {
    in[i]=in[i]>>8|in[i]<<8;   
  }

}

void swap_half_16_4th(uint16_t *data,int len)
{
 printf("\n%s start:\n",__func__) ;
 uint8_t *tmp=(uint8_t *) data;

 while(len>0)
 {
   __asm( "movb  0(%%esi),%%ah\n\t"
          "movb  1(%%esi),%%al\n\t"
          "movw   %%ax,(%%esi)\n\t" 
          :"+a"(data)
          :"S"(tmp));
    tmp+=2;
    len--; 
 }   
}
int main(int argv ,char **argc)
{
  uint16_t data[4]={0x1312,0x1512,0x1712,0x1812};

  funVar(data);
  printf("0x%X,0x%X,0x%X,0x%X\n",data[0],data[1],data[2],data[3]); 

  SWH_16(1st)(data,4);       
  printf("0x%X,0x%X,0x%X,0x%X\n",data[0],data[1],data[2],data[3]); 

  SWH_16(2nd)(data,4);    
  printf("0x%X,0x%X,0x%X,0x%X\n",data[0],data[1],data[2],data[3]); 

  SWH_16(3rd)(data,4);    
  printf("0x%X,0x%X,0x%X,0x%X\n",data[0],data[1],data[2],data[3]); 

  SWH_16(4th)(data,4);    
  printf("0x%X,0x%X,0x%X,0x%X\n",data[0],data[1],data[2],data[3]);

  system("pause"); 
  return 0 ;
}

这里写图片描述

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值