打印
[牛人杂谈]

位集合的概念,你会吗?

[复制链接]
572|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xuanhuanzi|  楼主 | 2024-2-27 16:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
位集合是一种数据结构,用于存储一组位(或者说是布尔值)。每个位都代表一个元素,其值可以是 0 或者 1,分别表示元素不存在或者存在。这种数据结构通常用于需要高效地存储大量布尔值的情况,比如处理状态标志、位图等。
下面这段代码定义了一个位集合(Bitset)的结构,以及两个用于操作位集合的函数:set_bit 和 get_bit。
#include <stdint.h>

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

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

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


使用特权

评论回复
沙发
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 | 只看该作者
逻辑操作写成一个头文件,可以方便使用。

使用特权

评论回复
5
幸福小强| | 2024-2-28 17:03 | 只看该作者
#ifndef BIT_OPERATIONS_H
#define BIT_OPERATIONS_H

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

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

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

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

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

#endif /* BIT_OPERATIONS_H */

使用特权

评论回复
6
幸福小强| | 2024-2-28 17:04 | 只看该作者
此头文件中定义了几个常用的位操作宏,包括设置位、清除位、反转位和检查位是否为1。使用这些宏可以方便地对位进行操作,提高了代码的可读性和可维护性。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

173

主题

2211

帖子

3

粉丝