C语言实现位数组(BitArray)

简介

所谓的位数组,主要是为了有效地利用内存空间而设计的一种存储数据的方式。在这种结构中一个整数在内存中用一位(1 bit)表示。这里所谓的表示就是如果整数存在,相应的二进制位就为1,否则为0。

在嵌入式裸机开发中,ram资源是非常有限的,像一些开关变量只有0和1,经常是通过bit位来管理,c语言进行位操作是非常高效的。

但是嵌入式一般是32位系统(8位机只有8位),如果直接用一个变量进行管理时,管理最大的长度为32位,如uint32_t,有上限。所以本文定义了一个静态位数组和管理行为,方便用户实现无限位宽的管理需要。实现了常用的bit控制行为。

本项目地址:bobwenstudy/bit_array_static (github.com)

项目开发过程中参考了如下两个项目:windsgo/sliding_counter: 滑动窗口计数器,静态内存分配,基于bit-array二进制位数组 (github.com)和noporpoise/BitArray: C bit array structs and methods (github.com)。

代码结构

代码结构如下所示:

  • bit_array.h:BitArray管理API,都是inline实现,可以根据需要转成c实现。
  • main.c:测试例程。
  • build.mkMakefile:Makefile编译环境。
  • README.md:说明文档
bare_task_msg├── bit_array.h├── build.mk├── main.c├── Makefile└── README.md

使用说明

具体如何使用直接看例程就行,非常简单,看函数名和变量名即可。

默认是使用uint32_t为最小存储单元,可以通过BIT_ARRAY_CONFIG_64使能切换为uint64_t为最小存储单元。

BitArray声明

如下定义了一个100bit长度的位数组,在32位系统中,实际暂用了4个uint32_t的存储空间。

BIT_ARRAY_DEFINE(test_bit_array, 100);

位基本操作API

主要有以下API。

static inline int bit_array_get(const bit_array_t *target, int bit);
static inline void bit_array_clear(bit_array_t *target, int bit);
static inline void bit_array_set(bit_array_t *target, int bit);
static inline void bit_array_toggle(bit_array_t *target, int bit);
static inline void bit_array_assign(bit_array_t *target, int bit, int val);
static inline void bit_array_clear_all(bit_array_t *target, int num_bits);
static inline void bit_array_set_all(bit_array_t *target, int num_bits);
static inline void bit_array_toggle_all(bit_array_t *target, int num_bits);static inline int bit_array_num_bits_set(bit_array_t *target, int num_bits);
static inline int bit_array_num_bits_cleared(bit_array_t *target, int num_bits);

位数组copy API

主要有以下API。

static inline void bit_array_copy(bit_array_t* dst, int dstindx,const bit_array_t* src, int srcindx,int length, int src_num_bits, int dst_num_bits);
static inline void bit_array_copy_all(bit_array_t* dst, const bit_array_t* src, int num_bits);

位数组逻辑运算API

主要有以下API。

static inline void bit_array_and(bit_array_t* dest, const bit_array_t* src1, const bit_array_t* src2, int num_bits);
static inline void bit_array_or (bit_array_t* dest, const bit_array_t* src1, const bit_array_t* src2, int num_bits);
static inline void bit_array_xor(bit_array_t* dest, const bit_array_t* src1, const bit_array_t* src2, int num_bits);
static inline void bit_array_not(bit_array_t* dest, const bit_array_t* src, int num_bits);

位数组移位操作API

主要有以下API。

void bit_array_shift_right(bit_array_t* target, int num_bits, int shift_dist, int fill);
void bit_array_shift_left (bit_array_t* target, int num_bits, int shift_dist, int fill);

测试说明

环境搭建

目前测试暂时只支持Windows编译,最终生成exe,可以直接在PC上跑。

目前需要安装如下环境:

  • GCC环境,笔者用的msys64+mingw,用于编译生成exe,参考这个文章安装即可。Win7下msys64安装mingw工具链 - Milton - 博客园 (cnblogs.com)。

编译说明

本项目都是由makefile组织编译的,编译整个项目只需要执行make all即可。

也就是可以通过如下指令来编译工程:

make all

而后运行执行make run即可运行例程,例程中实现了上述API的基本测试。

PS D:\workspace\github\bit_array_static> make run
Building   : "output/main.exe"
Start Build Image.
objcopy -v -O binary output/main.exe output/main.bin
copy from `output/main.exe' [pei-i386] to `output/main.bin' [binary]
objdump --source --all-headers --demangle --line-numbers --wide output/main.exe > output/main.lst
Print Sizetext    data     bss     dec     hex filename55932    7028    2644   65604   10044 output/main.exe
./output/main.exe
Testing test_assign ........................................................ pass
Testing test_set_clear ..................................................... pass
Testing test_toggle ........................................................ pass
Testing test_copy .......................................................... pass
Testing test_logic ......................................................... pass
Testing test_shift ......................................................... pass
Executing 'run: all' complete!
PS D:\workspace\github\bit_array_static>

可以看到,所有测试都通过。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/692531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单片机01天_stm32f407zg_创建新工程

创建“寄存器版工程” 1、创建工程文件夹 创建工程文件夹“Project”,内部包含文件夹“CMSIS”&&“USER”。 CMSIS:Cortex系列内核接口驱动文件。 USER:存放用户编写的程序文件。 “USER”文件夹内包含“Inc”&&“Src”…

陶陶摘苹果C++

题目&#xff1a; 代码&#xff1a; #include<iostream> using namespace std; int main(){//一、分析问题//已知&#xff1a;10 个苹果到地面的高度a[10],陶陶把手伸直的时候能够达到的最大高度height//未知&#xff1a;陶陶能够摘到的苹果的数目sum。//关系&#xff…

Google:Gemini 1.5跨数百万上下文令牌解锁多模态理解技术报告(中文)

1、概述 在本报告中,我们展示了 Gemini 系列的最新模型 Gemini 1.5 Pro,这是一个计算效率极高的多模态专家混合模型,能够从数百万个上下文标记中回忆和推理细粒度信息,包括多个长文档和数小时的视频和音频。Gemini 1.5Pro 在跨模态的长上下文检索任务上实现了近乎完美的召回…

《Solidity 简易速速上手小册》第2章:搭建 Solidity 开发环境(2024 最新版)

文章目录 2.1 安装和配置 Solidity2.1.1 基础知识解析安装 Solidity 编译器配置开发环境熟悉命令行工具 2.1.2 重点案例&#xff1a;配置本地开发环境案例 Demo&#xff1a;配置本地 Solidity 环境案例代码&#xff1a;HelloWorld.sol 2.1.3 拓展案例 1&#xff1a;设置 Remix …

【MySQL】Navicat/SQLyog连接Ubuntu中的数据库(MySQL)

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、安装…

Burp常见问题

前言 本文举例了几个常见的软件工具使用问题&#xff0c;文末会提供一些我自己整理和使用的工具资料 。 "在追逐零 Bug 的路上&#xff0c;我们不断学习、改进&#xff0c;更加坚定自己的技术信念。让我们相信&#xff0c;每一个 Bug 都是我们成长的机会。" 一、VM…

2 F. Greetings(离散化+树状数组)

题目链接 F. Greetings 题意 题解 由于两个人的速度是一样的&#xff0c;所以到达终点之前两个人是不会相遇的&#xff0c;考虑一下什么情况两个人会相遇&#xff0c;其中一个人到达终点时&#xff0c;另一个人&#xff0c;终点所在地的前面&#xff0c;并且它的终点在更右边…

模式匹配这么好,Java语法里有吗?

这篇文章我们借助新版Java来理解模式匹配&#xff0c;Rust版的模式匹配稍后就端上来&#xff0c;各位先尝尝Java这杯老咖啡还香不香&#x1f604;。 什么是模式匹配&#xff1f; 下图直观的表达了模式匹配的概念。 所谓模式类似上图中木盒的各种形状的洞洞&#xff0c;我们…

Unable to make field private JavacProcessingEnvironment$DiscoveredPro报错解决办法

maven项目打包报错 报错信息 Unable to make field private com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors com.sun.tools.javac.processing.JavacProcessingEnvironment.discoveredProcs accessible: module jdk.compiler does not &q…

proxysql

这里是引用 mysql 安装 mysql-3307 mysql -P 3307 -u root -proot -h 10.211.55.8create database db1; CREATE TABLE db1.tab_20240102 (id INT PRIMARY KEY,name VARCHAR(50),email VARCHAR(50),age INT ); CREATE TABLE db1.tab_20240103 (id INT PRIMARY KEY,name V…

2.20总结

根据这周的学习任务在学习KMP算法和哈希算法,这两种算法主要都用于字符串&#xff0c;而且学习起来都有一定的难度&#xff0c;刚开始的时候一个视频要看好几遍才能弄懂&#xff0c;但是经过这两天的学习也有了一定的收KMP 我通过一小段简单的代码来强化我对于KMP算法的理解&a…

postgis sde表在geoserver中服务发布

文章目录 简要说明maven依赖样例代码 简要说明 利用开源工具geoserver-manager&#xff0c;对postgresql的空间表进行地图服务发布 maven依赖 <dependency><groupId>com.github.dov-vlaanderen</groupId><artifactId>geoserver-manager</artifact…

【MySQL】 多表查询与笛卡尔积深入学习

推荐一款AI网站 AI写作与AI绘画智能创作平台 - 海鲸AI | 智能AI助手&#xff0c;可以免费领取GPT3.5无限卡 在数据库操作中&#xff0c;多表查询是一项基础而重要的技能。它允许我们从多个表中检索数据&#xff0c;以便进行复杂的数据分析和报告。本文将深入探讨MySQL中的多表查…

model.train()和model.eval()两种模式的原理

1. model.train() 在使用 pytorch 构建神经网络的时候&#xff0c;训练过程中会在程序上方添加一句model.train()&#xff0c;作用是 启用 batch normalization 和 dropout 。 如果模型中有BN层&#xff08;Batch Normalization&#xff09;和 Dropout &#xff0c;需要在 训练…

3. B. Milena and Admirer(贪心、小结论、思维)

题目链接 B. Milena and Admirer 题意 给一个长度为 n n n的序列&#xff0c;我们通过操作使这个序列变成非递减序列 操作&#xff1a;对 a [ i ] a[i] a[i]&#xff0c;我们将 a [ i ] a[i] a[i]删除&#xff0c;将 a [ i ] − x 、 x a[i]-x、x a[i]−x、x插入原位置&…

Oracle19c | 操作归纳

本篇目录 1. PDB 可插拔数据库1.1 创建 PDB 1. PDB 可插拔数据库 1.1 创建 PDB # oralce 19c 创建 pdb CREATE PLUGGABLE DATABASE pdb_name ADMIN USER username IDENTIFIED BY password; # oralce 19c 启用数据库 ALTER PLUGGABLE DATABASE pdb_name OPEN; # 切换 pdb alte…

【感知算法】Dempster-Shafer理论(下)

尝试DS理论应用到自动驾驶地图众包更新。 地图特征变化判断 a mass function is applied to quantify the evidence of the existence. existence state: existenct、non-existent、tenative、conflict ∃ ∄ Ω ϕ \exist \\ \not\exist \\ \Omega \\ \phi ∃∃Ωϕ ma…

对 babel 的了解,几个 stage 代表的意思

What is Babel? Babel Babel 是一个广泛使用的 JavaScript 编译器&#xff0c;它主要用于将 ECMAScript 2015&#xff08;ES6&#xff09;代码转换为向后兼容的 JavaScript 版本&#xff0c;以便在不同浏览器和环境中运行。Babel 具有强大的插件系统&#xff0c;可以通过插件…

阿里云服务器多少钱?2024年阿里云服务器价格配置表出炉!

2024年阿里云服务器租用价格表更新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、ECS u1实例2核4G、5M固定带宽、80G ESSD Entry盘优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元、2核4G4M带宽轻量服务器一年165元12个月、2核4G服…

docker的底层原理六: 联合文件系统(UnionFS)

Docker的底层存储原理基于联合文件系统&#xff08;UnionFS&#xff09;。 联合文件系统&#xff08;UnionFS&#xff09;是一种特殊的文件系统&#xff0c;它允许独立地叠加多个目录层&#xff0c;呈现给用户的是这些目录层的联合视图。这种结构使得在Docker中&#xff0c;不…