C语言如何分离一个数的高低位,如何将2个字节变成一个字节

关于这个概念,是我从工作中学习的,虽然在读书的时候就应该要掌握,但是在开发中,这项技能尤其重要。我是做嵌入式开发的,在嵌入式开发过程中,如何对数据操作必然是不可缺少的问题,接下来,我们来看一个例子:

1.

#include <stdio.h>
int main(void)
{
	unsigned int  temp = 0x10 ;
	unsigned int  high = (temp - temp % 0x10) / 0x10 ;
	unsigned int  low = temp % 0x10 ;
	printf("high:%u    low:%u\n",high , low) ; 
	return 0 ;	
} 

这个例子就是将0x10这个无符号整型数进行高低位分离,结果就是high = 1 , low = 0 ;大家可以拿笔算一下,是不是这样一个结果。下次要是开发中要你将一个数的高地位分离出来,用这种最普通的算法便可以实现。

接下来,我们来看第二个例子:

2.

#include <stdio.h>
int main(void)
{
	unsigned int offset = 0x1234 ;
	unsigned int high = 0 ;
	unsigned int low = 0 ;
	high = ((offset >> 8 )& 0xff);
	low = (offset&0xff) ;
	printf("high = %p->%d   low = %p->%d\n",high , high ,low ,low);
}

C语言中的位操作在嵌入式开发中也是非常常见的,清位,置位,异或,左移,右移,逻辑取反,按位取反,这些概念希望想从事这方面开发的技术人员务必精通它,因为太常见了。

我们来分析一下这个例子,首先这道题其实就是将一个16进制的高低8位进行分离,offset = 0x1234 ,将这个数右移8位,然后与上0xff便取到了这个数的高8位12,将offset与上0xff便取到了这个数的低8位,这样就达到了分离高地位的目的,这种方法比较简单,不理解的,把它记住就行了,下次直接用。

接下来,我们来看第三个例子:

3.

#include <stdio.h>
int RecordBuffer[10];
int buffer_write(unsigned int *buffer , int size_to_write) ;
int main(void)
{
	unsigned int buffer[] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09 ,0x0a};
	buffer_write(buffer , 10);
	int i ;
	for(i = 0 ; i < 10 ; i++) 
		printf("Recordbuffer[%d]:%p\n",i , RecordBuffer[i]);
	
	return 0 ;
}

int buffer_write(unsigned int *buffer , int size_to_write)
{
	int *p = (int *)buffer ;
	int i ;
	for(i = 0 ; i < size_to_write ;i += 2)
 	 {
 		RecordBuffer[i/2] = *(p+i)|(*(p+i+1) << 8) ;
 	 	
 	 }  		
}

这个例子就是将数组传进来的1,2,3,4,5,6,7,8,9,10每两个合并成一个字节,合并出来的结果就是0201,0403,0605,0807,0A09,这样的算法其实非常节省空间,相当于把10个数变成5个数然后存到数组里面去。这样的方法当时我也是第一次知道,就是在写SPI_FLASH写操作时,由于汇编代码中的数据是高低位存储的,于是我就想到了这个方法,将数据写到了汇编函数里去。这种方法有点类似上面的一种,只不过多了个数组,可以慢慢的理解一下,或者找Debug调试一下出结果就知道是为什么了。

Engineer-Bruce_Yang CSDN认证博客专家 嵌入式硬件 单片机 arm开发
本科毕业于华南理工大学,现美国卡罗尔工商管理硕士研究生在读,曾就职于世界名企伟易达、联发科技等,多年嵌入式产品开发经验,在智能玩具、安防产品、平板电脑、手机开发有丰富的实战开发经验,现任深圳市云之手科技有限公司副总经理、研发总工程师。
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页