C/C++语言,对MSB、LSB的读/取处理
2015-09-27 11:56
155 查看
1. 做硬件的都知道,串口是LSB优先,I2C、1553B是MSB优先,这里的MSB、LSB指的是二进制位的位置,区别于【字节序】(通信中,先发送低字节,还是高字节的问题,那叫大端big-endian、小端little-endian)
如果需要自己来实现MSB、LSB的读取、转换,如何实现呢?下面给出C/C++程序:
2. 字节序的大端、小端:
x86系统用的是小端(little-endian),简单说:就是“先存储低字节,后存储高字节”,或者说“先低后高”
例如:unsigned int xyz = 0x0A0B0C0D;
内存中,先存储的0x0D, 0x0C, 0x0B,......,就是上面说的“先低后高”
字节序大端和小端,参加另一篇文章:http://blog.csdn.net/dijkstar/article/details/6877575
如果需要自己来实现MSB、LSB的读取、转换,如何实现呢?下面给出C/C++程序:
#include "stdio.h" #define BITS_WIDTH (8) void main() { int val = 0; int i=0; // //接收:MSB在最左边,先进来 // for (i=0; i<BITS_WIDTH; i++) { val<<=1; if(i==0 || i==7)//模拟第N位上有高位 val++; } printf("接收MSB在最左边1,0x%x\n", val); // //接收:MSB在最左边,先进来 // val = 0; for (i=0; i<BITS_WIDTH; i++) { if(i==0 || i==2)//模拟第N位上有高位 { val |=1<<(BITS_WIDTH-1-i); } } printf("接收MSB在最左边2,0x%x\n", val); // //接收:LSB在最左边,先进来 // val = 0; for (i=0; i<BITS_WIDTH; i++) { //模拟第N位上有高位 if(i==0 || i==1) { val |=1<<i; } } printf("接收LSB在最左边,0x%x\n", val); printf("\n"); // //发送: 先发送高位,后发送低位 // val= 0x25; printf("发送数值0x%x按先高位后低位顺序: ", val); for (i=0; i<BITS_WIDTH; i++) { if ((val&0x80) == 0) printf("0, "); else printf("1, "); val <<=1; } printf("\n"); // //发送: 先发送低位,后发送高位 // val= 0x25; printf("发送数值0x%x按先低位后高位顺序: ", val); for (i=0; i<BITS_WIDTH; i++) { if ((val&0x01) == 0) printf("0, "); else printf("1, "); val >>=1; } printf("\n"); }
2. 字节序的大端、小端:
x86系统用的是小端(little-endian),简单说:就是“先存储低字节,后存储高字节”,或者说“先低后高”
例如:unsigned int xyz = 0x0A0B0C0D;
内存中,先存储的0x0D, 0x0C, 0x0B,......,就是上面说的“先低后高”
字节序大端和小端,参加另一篇文章:http://blog.csdn.net/dijkstar/article/details/6877575
相关文章推荐
- 栈的C语言实现
- SetConsoleTextAttribute()用法
- C语言程序初体验-第十一课-第四题:玩数字
- 在C/C++中调用python的简单笔记part 1
- c++如何返回数组
- 黑马程序员——C语言基础---运算符
- HowTo: Export C++ classes from a DLL
- 孙鑫VC++深入详解:Lesson8 Part3---如何让对话框捕获WM_KEYDOWN消息?
- 检测字符串中有多少个单词改新--C语言谭浩强版例6.8
- C++静态库与动态库
- C++机器学习古典材料
- C语言 gets()和scanf()函数的区别
- C语言格式控制符
- C++ new和delete重载
- 【C++ Primer】高级主题
- 【C++ Primer】面向对象编程与泛型编程
- 【C++ primer】类和数据抽象
- 【C++ Primer】容器和算法
- 【C++ Primer】基本语言
- C语言基本数据类型