C语言中的位域(位段)在循环缓冲区的使用

C语言中的位域(位段)在循环缓冲区的使用一 概念所谓 位域 是把一个字节中的二进位划分为几个不同的区域 并说明每个区域的位数 每个域有一个域名 允许在程序中按域名进行操作 这样就可以把几个不同的对象用一个字节的二进制位域来表示 有些数据在存储时 并不需要占用一个完整的字节 而只

大家好,欢迎来到IT知识分享网。

一、概念

所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。

有些数据在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便。

C语言又提供了一种数据结构称为位域(位段)

二、定义

typedef union { struct { unsigned index : 7 ; }bit; uint16_t max; }index_128_t; 

上述代码中,在联合体union中就定义拉一个位域bit,占用7个位,最大可以表示为2^7-1 = 127。这一特性可以很好的使用在循环缓冲区中,上述最大为127,则可以定义一个128字节的缓冲区,定义一个读指针,一个写指针。写指针一直向前加,加到127后自动重置为0,很是方便。同理读指针也是一样的。

三、循环缓冲区使用

循环缓冲区(也称为环形缓冲区)是固定大小的缓冲区,工作原理就像内存是连续的且可循环的一样。在生成和使用内存时,不需将原来的数据全部重新清理掉,只要调整read/write 指针即可。当添加数据时,writer指针前进。当使用数据时,read指针向前移动。当到达缓冲区的尾部时,指针又回到缓冲区的起始位置。

先定义一个位段,缓冲区的大小设定在2048字节。

typedef union { struct { unsigned index : 11 ; }bit; uint16_t max; }index_2048_t;

循环缓冲区数据结构定义:

typedef union { struct { unsigned index : 11 ; }bit; uint16_t max; }index_2048_t;

循环缓冲区相关的API定义:

void ring_buffer_2048_init(ring_buffer_2048_t * rb,unsigned char * buffer); unsigned int ring_buffer_2048_write_char(ring_buffer_2048_t * rb,unsigned char data); unsigned int ring_buffer_2048_write(ring_buffer_2048_t * rb ,unsigned char * data,uint16_t len); unsigned int ring_buffer_2048_read(ring_buffer_2048_t *rb,unsigned char * rev,uint16_t revLen); void ring_buffer_2048_clr(ring_buffer_2048_t *rb); unsigned int ring_buffer_2048_len(ring_buffer_2048_t *rb); unsigned char ring_buffer_2048_front(ring_buffer_2048_t * rb); unsigned char ring_buffer_2048_rear(ring_buffer_2048_t * rb);

循环缓冲区相关代码截图:

C语言中的位域(位段)在循环缓冲区的使用

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/163886.html

(0)
上一篇 2024-12-22 11:33
下一篇 2024-12-22 11:45

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信