zzgezi的个人空间 https://bbs.21ic.com/?712331 [收藏] [复制] [RSS]

日志

转: C/C++语言,对MSB、LSB的读/取处理

已有 869 次阅读2016-8-9 09:45 |个人分类:学习笔记|系统分类:兴趣爱好

1. 做硬件的都知道,串口是LSB优先,I2C、1553B是MSB优先,这里的MSB、LSB指的是二进制位的位置,区别于【字节序】(通信中,先发送低字节,还是高字节的问题,那叫大端big-endian、小端little-endian)


如果需要自己来实现MSB、LSB的读取、转换,如何实现呢?下面给出C/C++程序:

  1. #include "stdio.h"  
  2.   
  3. #define BITS_WIDTH  (8)  
  4.   
  5. void main()  
  6. {  
  7.     int val = 0;  
  8.     int i=0;  
  9.     //  
  10.     //接收:MSB在最左边,先进来  
  11.     //  
  12.     for (i=0; i<BITS_WIDTH; i++)  
  13.     {  
  14.         val<<=1;  
  15.         if(i==0 || i==7)//模拟第N位上有高位  
  16.             val++;  
  17.     }  
  18.     printf("接收MSB在最左边1,0x%x\n", val);  
  19.   
  20.     //  
  21.     //接收:MSB在最左边,先进来  
  22.     //  
  23.     val = 0;  
  24.     for (i=0; i<BITS_WIDTH; i++)  
  25.     {  
  26.         if(i==0 || i==2)//模拟第N位上有高位  
  27.         {  
  28.             val |=1<<(BITS_WIDTH-1-i);  
  29.         }  
  30.     }  
  31.     printf("接收MSB在最左边2,0x%x\n", val);  
  32.   
  33.     //  
  34.     //接收:LSB在最左边,先进来  
  35.     //  
  36.     val = 0;  
  37.     for (i=0; i<BITS_WIDTH; i++)  
  38.     {  
  39.         //模拟第N位上有高位  
  40.         if(i==0 || i==1)  
  41.         {  
  42.             val |=1<<i;  
  43.         }  
  44.     }  
  45.     printf("接收LSB在最左边,0x%x\n", val);  
  46.   
  47.     printf("\n");  
  48.   
  49.   
  50.     //  
  51.     //发送: 先发送高位,后发送低位  
  52.     //  
  53.     val= 0x25;  
  54.     printf("发送数值0x%x按先高位后低位顺序: ", val);  
  55.     for (i=0; i<BITS_WIDTH; i++)  
  56.     {  
  57.         if ((val&0x80) == 0)  
  58.             printf("0, ");  
  59.         else   
  60.             printf("1, ");  
  61.   
  62.         val <<=1;  
  63.     }  
  64.     printf("\n");  
  65.   
  66.   
  67.     //  
  68.     //发送: 先发送低位,后发送高位  
  69.     //  
  70.     val= 0x25;  
  71.     printf("发送数值0x%x按先低位后高位顺序: ", val);  
  72.     for (i=0; i<BITS_WIDTH; i++)  
  73.     {  
  74.         if ((val&0x01) == 0)  
  75.             printf("0, ");  
  76.         else   
  77.             printf("1, ");  
  78.           
  79.         val >>=1;  
  80.     }  
  81.     printf("\n");  
  82.   
  83. }  

2. 字节序的大端、小端:

x86系统用的是小端(little-endian),简单说:就是“先存储低字节,后存储高字节”,或者说“先低后高”

例如:unsigned int xyz = 0x0A0B0C0D;


内存中,先存储的0x0D, 0x0C, 0x0B,......,就是上面说的“先低后高”


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)