在嵌入式系统、操作系统内核或高性能计算中,我们常常需要以最小的内存开销来表示大量布尔状态。这时候,C语言位集(Bitset)就派上用场了!本文将手把手教你从零开始实现一个功能完整的位集结构,即使你是编程小白,也能轻松理解。
位集(Bitset)是一种数据结构,它使用单个二进制位(bit)来表示一个布尔值(0 或 1)。相比于使用 char 或 int 类型(通常占 1 字节或 4 字节)来存储 true/false,位集能节省高达 8 倍甚至 32 倍的内存空间!
C语言提供了强大的位操作能力,如 &(与)、|(或)、^(异或)、~(取反)、<<(左移)、>>(右移)。这些操作直接作用于二进制位,执行效率极高,是实现位集的基础。
我们将创建一个支持以下功能的位集:
typedef struct { unsigned int *data; // 存储位的数组 size_t size; // 总共多少位 size_t num_words; // 需要多少个 unsigned int 来存储} Bitset; #include <stdlib.h>#include <string.h>Bitset* bitset_create(size_t num_bits) { Bitset *bs = (Bitset*)malloc(sizeof(Bitset)); if (!bs) return NULL; bs->size = num_bits; // 计算需要多少个 unsigned int(假设每个 unsigned int 是 32 位) bs->num_words = (num_bits + 31) / 32; // 向上取整 bs->data = (unsigned int*)calloc(bs->num_words, sizeof(unsigned int)); if (!bs->data) { free(bs); return NULL; } return bs;} 下面是我们实现的几个关键函数:
// 设置第 index 位为 1void bitset_set(Bitset *bs, size_t index) { if (index >= bs->size) return; size_t word_index = index / 32; size_t bit_index = index % 32; bs->data[word_index] |= (1U << bit_index);}// 清除第 index 位(设为 0)void bitset_clear(Bitset *bs, size_t index) { if (index >= bs->size) return; size_t word_index = index / 32; size_t bit_index = index % 32; bs->data[word_index] &= ~(1U << bit_index);}// 翻转第 index 位void bitset_flip(Bitset *bs, size_t index) { if (index >= bs->size) return; size_t word_index = index / 32; size_t bit_index = index % 32; bs->data[word_index] ^= (1U << bit_index);}// 获取第 index 位的值(0 或 1)int bitset_get(Bitset *bs, size_t index) { if (index >= bs->size) return 0; size_t word_index = index / 32; size_t bit_index = index % 32; return (bs->data[word_index] >> bit_index) & 1;}// 释放位集内存void bitset_destroy(Bitset *bs) { if (bs) { free(bs->data); free(bs); }} #include <stdio.h>int main() { // 创建一个能存储 100 位的位集 Bitset *bs = bitset_create(100); if (!bs) { printf("创建失败!\n"); return -1; } // 设置第 5 位和第 50 位 bitset_set(bs, 5); bitset_set(bs, 50); // 查询 printf("第 5 位: %d\n", bitset_get(bs, 5)); // 输出 1 printf("第 6 位: %d\n", bitset_get(bs, 6)); // 输出 0 printf("第 50 位: %d\n", bitset_get(bs, 50)); // 输出 1 // 翻转第 5 位 bitset_flip(bs, 5); printf("翻转后第 5 位: %d\n", bitset_get(bs, 5)); // 输出 0 // 清理 bitset_destroy(bs); return 0;} 通过合理使用C语言位运算,我们的位集实现具有极高的时间和空间效率。典型应用场景包括:
本文详细讲解了如何在 C 语言中从零实现一个功能完整的位集实现。通过掌握位操作技巧,你不仅能写出更高效的代码,还能深入理解计算机底层的存储机制。希望这篇教程能帮助你掌握这一重要的编程技能!
关键词回顾:C语言位集、位操作、C语言位运算、位集实现
本文由主机测评网于2025-12-06发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025123676.html