由訊號集聯想 位域授權模式的不限長擴充套件

2021-08-26 06:36:42 字數 1364 閱讀 5175

author: selfimpr

blog:

mail: [email protected]

位域是一種常用的授權手段: 利用整型數值的每乙個二進位制位代表一種授權, 1和0分別代表有/無授權.

例如:

如果以乙個整型進行增刪改查四種授權.

假定使用該整型的後4位從右至左分別代表增刪改查四種操作的授權. 那麼:

二進位制: 0b1111, 十進位制: 15, 十六進製制: 0xf 代表擁有4種許可權.

二進位制: 0b0000, 十進位制: 0, 十六進製制: 0x0 代表4種許可權都沒有.

二進位制: 0b0101, 十進位制: 5, 十六進製制: 0x5 代表有刪和查許可權.

但是, 在給定計算機系統/平台上, 它的整型的長度是有限的. 目前主流計算機應該是sizeof(int) = 8. 因此是(8位元組) * (8位/位元組) = 64位

今天在看apue訊號集的時候, 看到了訊號集的處理方式: 自定義乙個結構, 使用整型陣列儲存, 根據給定計算條件計算位置運算.

下面是乙個簡單的實現.

bit.h

#include #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; #define mb_convert_bit(n, b, bit) \ do 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 mb_check(mb_t *d, unsigned int bit) int mb_set(mb_t *d, unsigned int bit) int mb_clear(mb_t *d, unsigned int bit)

bit_main.c(測試程式)

#include "bit.h" #include static void mb_print(mb_t *) ; void main(void) static void mb_print(mb_t *d) printf("\n"); }

上面的實現存在的問題, 已知是: 同一程序中無法建立多個使用不同長度限定的mb_t.

有未盡之處, 請指正...謝謝.

由return聯想到的

大多數函式都包含一條return 語句,return 語句導致函式停止執行。使函式停止執行的還有break,throw,他們叫強制跳轉語句。return語句使函式停止執行,如果 塊裡為 return 或者 沒有return 那麼函式會返回乙個undefined值給呼叫者。另外,在控制台為什麼會返回u...

由修電腦聯想到的

當初學計算機應用這個專業肯定沒想到日後最大的需求是為我周圍的電腦菜菜們的排憂解難,在我看來這個專業應該屬於益工型的專業,假如你說憑他找工作,當個職業幹,基本上想賺錢很難,而且十分瑣碎,頂著個所謂的技術工程師的帽子其實和看門大爺,服務員和水電工區的工作沒有什麼區別。在此我只涉及我接觸過的網管類以及技術...

訊號集與阻塞訊號

訊號是一種軟體中斷,是一種處理程序間非同步的通訊機制。訊號可以導致乙個正在執行的程序被另乙個非同步程序中斷,轉而處理某乙個突發事件。常見的訊號 kill l 命令檢視 1 sighup 2 sigint 3 sigquit 4 sigill 5 sigtrap 6 sigabrt 7 sigbus ...