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

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


如果需要自己来实现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;

C/C++语言,对MSB、LSB的读/取处理_第1张图片

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


字节序大端和小端,参加另一篇文章:http://blog.csdn.net/dijkstar/article/details/6877575


你可能感兴趣的:(C/C++语言,对MSB、LSB的读/取处理)