由信号集联想----位域授权模式的不限长扩展

本文探讨了位域在授权应用中的使用方法,并通过一个简单的实现案例展示如何使用整型数组来处理信号集,包括初始化、检查、设置和清除等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

author: selfimpr

blog: http://blog.youkuaiyun.com/lgg201

mail: lgg860911@yahoo.com.cn


位域是一种常用的授权手段: 利用整型数值的每一个二进制位代表一种授权, 1和0分别代表有/无授权.

例如:

如果以一个整型进行增删改查四种授权.

假定使用该整型的后4位从右至左分别代表增删改查四种操作的授权. 那么:

二进制: 0b1111, 十进制: 15, 十六进制: 0xF 代表拥有4种权限.

二进制: 0b0000, 十进制: 0, 十六进制: 0x0 代表4种权限都没有.

二进制: 0b0101, 十进制: 5, 十六进制: 0x5 代表有删和查权限.


但是, 在给定计算机系统/平台上, 它的整型的长度是有限的. 目前主流计算机应该是sizeof(int) = 8. 因此是(8字节) * (8位/字节) = 64位


今天在看APUE信号集的时候, 看到了信号集的处理方式: 自定义一个结构, 使用整型数组存储, 根据给定计算条件计算位置运算.


下面是一个简单的实现.

bit.h

#include <stdio.h> #define MB_T_D_TYPE unsigned int #define MB_T_D_TBITS (unsigned int)(sizeof(MB_T_D_TYPE) * 8) #define MB_T_D_BITS 128 #define MB_T_D_SIZE (MB_T_D_BITS - 1) / (MB_T_D_TBITS) + 1 typedef struct _mb_t { MB_T_D_TYPE d[MB_T_D_SIZE]; } mb_t; #define MB_CONVERT_BIT(n, b, bit) \ do { \ n = bit / MB_T_D_TBITS; \ b = bit % MB_T_D_TBITS; \ } while(0) void mb_init(mb_t *) ; int mb_check(mb_t *, unsigned int) ; int mb_set(mb_t *, unsigned int) ; int mb_clear(mb_t *, unsigned int) ;
bit.c

#include "bit.h" void mb_init(mb_t *d) { int i = 0; while ( i < MB_T_D_SIZE ) { *(d->d + i) = 0; i ++; } } int mb_check(mb_t *d, unsigned int bit) { int n, b; MB_CONVERT_BIT(n, b, bit); return *(d->d + n) & (1 << (MB_T_D_TBITS - b)); } int mb_set(mb_t *d, unsigned int bit) { int n, b; MB_CONVERT_BIT(n, b, bit); *(d->d + n) = *(d->d + n) | (1 << (MB_T_D_TBITS - b)); } int mb_clear(mb_t *d, unsigned int bit) { int n, b; MB_CONVERT_BIT(n, b, bit); *(d->d + n) = *(d->d + n) & ~(1 << (MB_T_D_TBITS - b)); }
bit_main.c(测试程序)

#include "bit.h" #include <stdlib.h> static void mb_print(mb_t *) ; void main(void) { mb_t *d = malloc(sizeof(mb_t)); mb_init(d); mb_print(d); mb_set(d, 3); mb_print(d); mb_set(d, 5); mb_print(d); mb_clear(d, 3); mb_print(d); free(d); } static void mb_print(mb_t *d) { int i = 0; printf("0x"); while ( i < MB_T_D_SIZE ) { printf("%08X", *(d->d + i)); i ++; } printf("\n"); }
上面的实现存在的问题, 已知是: 同一进程中无法创建多个使用不同长度限定的mb_t.

有未尽之处, 请指正...谢谢.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值