由信号集联想----位域授权模式的不限长扩展
来源:互联网 发布:威海房地产成交数据 编辑:程序博客网 时间:2024/04/20 08:57
author: selfimpr
blog: http://blog.csdn.net/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) + 1typedef 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.
有未尽之处, 请指正...谢谢.
- 由信号集联想----位域授权模式的不限长扩展
- 由Adapter模式引起的联想
- 由Jobs的联想
- 联想V480”虚拟机被配置为64位客户机操作系统,但是64位操作不可用,已为该虚拟机禁用长模式“的解决办法
- 由视图控制器联想到的设计模式
- 由百度关键词联想联想到的
- 由”\u0000”产生的联想
- 由JDBC数据库连接所联想到的5种设计模式(转)
- 由JDBC数据库连接所联想到的五种设计模式
- 由内存的使用联想到的
- 由修电脑联想到的
- 由__doPostBack方法引起的联想
- 由SpringSource发布dm Server的联想
- 由MMX优化联想到的
- 由Passbook联想到Path的盈利模式
- 由 Android WebKit html5 引发的联想
- 由WS_OVERLAPPDWINDOW窗口的风格联想起
- 由vijos1067 联想到的矩阵乘法
- Java_static、this、super、final用法(1)
- 项目经理的商务指南系列之三:认识客户(敏捷开发,被动而弱小的客户,理解客户的古怪行为,如何喜欢上客户)
- Healthy Holsteins 健康的好斯坦奶牛
- Extjs combobox动态加载的实例
- C语言的extern用法-变量
- 由信号集联想----位域授权模式的不限长扩展
- VNC源码阅读--VNC图像更新机制
- Java_static、this、super、final用法(2)
- 禁用约束和触发器(数据库操作时临时取消约束,来避开数据库约束的引起的操作问题)
- Java_static、this、super、final用法(3)
- Java_static、this、super、final用法(4)
- VNC源码阅读笔记
- SQL点滴25—T-SQL面试语句(转载)
- 嵌入式Linux之我行——S3C2440上 ADC驱动实例开发讲解 .