[牛人杂谈] 位集合的概念,你会吗?

[复制链接]
1166|6
 楼主| xuanhuanzi 发表于 2024-2-27 16:22 | 显示全部楼层 |阅读模式
位集合是一种数据结构,用于存储一组位(或者说是布尔值)。每个位都代表一个元素,其值可以是 0 或者 1,分别表示元素不存在或者存在。这种数据结构通常用于需要高效地存储大量布尔值的情况,比如处理状态标志、位图等。
下面这段代码定义了一个位集合(Bitset)的结构,以及两个用于操作位集合的函数:set_bit 和 get_bit。
  1. #include <stdint.h>

  2. // 定义了一个位集合的结构
  3. typedef struct {
  4.     uint32_t bits; // 用一个32位的整数来存储位集合的所有位
  5. } Bitset;

  6. // 设置位集合中指定位置的位为1
  7. void set_bit(Bitset *bitset, int bit) {
  8.     bitset->bits |= (1U << bit); // 将指定位置的位设置为1
  9. }

  10. // 获取位集合中指定位置的位的值
  11. int get_bit(Bitset *bitset, int bit) {
  12.     return (bitset->bits >> bit) & 1U; // 获取指定位置的位的值
  13. }


 楼主| xuanhuanzi 发表于 2024-2-27 16:23 | 显示全部楼层
typedef struct {...} Bitset; 定义了一个名为 Bitset 的结构体,其中只有一个成员 bits,用于存储位集合的所有位。
set_bit 函数用于设置位集合中指定位置的位为1。它将使用按位或 | 操作符将原来的 bits 值与 (1U << bit) 进行按位或操作,将指定位置的位设置为 1。
get_bit 函数用于获取位集合中指定位置的位的值。它将使用右移 >> 和按位与 & 操作符将原来的 bits 值右移 bit 位后与 1U 进行按位与操作,从而获取指定位置的位的值。
这种方式可以很方便地操作位集合,例如,用于管理一组开关状态、标记某些条件的满足与否等。
heisexingqisi 发表于 2024-2-27 17:01 | 显示全部楼层
置位,清零,读取位。
幸福小强 发表于 2024-2-28 17:03 | 显示全部楼层
逻辑操作写成一个头文件,可以方便使用。
幸福小强 发表于 2024-2-28 17:03 | 显示全部楼层
  1. #ifndef BIT_OPERATIONS_H
  2. #define BIT_OPERATIONS_H

  3. // 定义一些常用的位操作宏

  4. // 将某个位设置为1
  5. #define SET_BIT(num, bit) ((num) |= (1 << (bit)))

  6. // 将某个位设置为0
  7. #define CLEAR_BIT(num, bit) ((num) &= ~(1 << (bit)))

  8. // 反转某个位
  9. #define TOGGLE_BIT(num, bit) ((num) ^= (1 << (bit)))

  10. // 检查某个位是否为1
  11. #define CHECK_BIT(num, bit) (((num) >> (bit)) & 1)

  12. #endif /* BIT_OPERATIONS_H */
幸福小强 发表于 2024-2-28 17:04 | 显示全部楼层
此头文件中定义了几个常用的位操作宏,包括设置位、清除位、反转位和检查位是否为1。使用这些宏可以方便地对位进行操作,提高了代码的可读性和可维护性。
夜晚有三年 发表于 2025-9-11 14:04 | 显示全部楼层
位集合是用二进制位表示元素存在的集合,每一位对应一个元素,1 表示存在,0 表示不存在,高效节省空间。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

183

主题

2331

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部