許可權操作與位運算

2021-07-26 20:01:02 字數 3794 閱讀 2059

php:

我這裡說到的許可權管理辦法是乙個普遍採用的方法,主要是使用到"位執行符"操作,& 位與運算子、| 位或執行符。參與運算的如果是10進製數,則會被轉換至2進製數參與運算,然後計算結果會再轉換為10進製數輸出。

它的許可權值是這樣的

2^0=1,相應2進數為"0001"(在這裡^我表示成"次方",即:2的0次方,下同)

2^1=2,相應2進數為"0010"

2^2=4,相應2進數為"0100"

2^3=8,相應2進數為"1000"

要判斷乙個數在某些數範圍內就可以使用 & 運算子(數值從上面的表中得來)

如:7=4|2|1 (你也可以簡單理解成7=4+2+1)

用 & 來操作,可以知道7&4、7&2、7&1都是真的,而如果7&8則是假的

&、| 不熟悉的就要去查查手冊,看看是怎麼用的了

下面來看例子吧:

<?

// 賦予許可權值-->刪除:8、上傳:4、寫入:2、唯讀:1

define("mdelete",8);

define("mupload",4);

define("mwrite",2);

define("mread",1);

//vvvvvvvvvvvvv使用說明vvvvvvvvvvvvv

//部門經理的許可權為(假設它擁有此部門的所有許可權),| 是位或執行符,不熟悉的就查查資料

echo mdelete|mupload|mwrite|mread ,"

";// 相當於是把上面的許可權值加起來:8+4+2+1=15

// 設我只有 upload 和 read 許可權,則

echo mupload|mread ,"

";//相當於是把上傳、唯讀的許可權值分別相加:4+1=5

/**賦予它多個許可權就分別取得許可權值相加,又比如某位員工擁有除了刪除外的許可權其餘都擁有,那它的許可權值是多少?

*應該是:4+2+1=7

*明白了怎麼賦值給許可權吧?

*///^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

//判斷某人的許可權可用,設許可權值在$key中

/**判斷許可權用&位與符,

*/$key = 13;//13=8+4+1

if($key & mdelete) echo "有刪除許可權

"; //8

if($key & mupload) echo "有上傳許可權

"; //4

$a=$key & mwrite; echo "有寫許可權

".$a; //無此許可權

if($key & mread) echo "有讀許可權

"; //1

?>

ok,許可權分值的這其中乙個演算法就是這樣的,可以說是簡單高效。也不知大家明白沒有,不明白也沒關係,記住例子就行了。前提就是做好許可權值的分布,即那個1、2、4、8、16....(這裡還有個順序問題,越高階的許可權就要越高的許可權值,比如上面的例子所演示的刪除許可權)。有了許可權分布表就可以確定給某個人什麼許可權了,你簡單的理解成要哪個許可權就加上相應的許可權值吧。

這個方法很好用的,缺點就是如果許可權分布得細的話,那麼許可權值會越來越大,你自己想想,2的幾次方、如果所有的許可權都要則是全部相加。不過對於一般的許可權來說這個已經足夠了。

c#:摘要:本文向您講解使用c#位運算來實現許可權管理,在設計許可權時, 把許可權管理操作轉換為c#位運算來處理。

標籤:c#位運算 許可權管理

常用的位運算主要有與(&), 或(|)和非(~), 比如:

1 & 0 = 0, 1 | 0 = 1, ~1 = 0

在設計許可權時, 我們可以把許可權管理操作轉換為c#位運算來處理.

第一步, 先建立乙個列舉表示所有的許可權管理操作:

/// 測試**

[flags]

public enum permissions

[flags]表示該列舉可以支援c#位運算, 而列舉的每一項值, 我們用2的n次方來賦值, 這樣表示成二進位制時剛好是1 = 0001, 2 = 0010, 4 = 0100, 8 = 1000等, 每一位表示一種許可權, 1表示有該許可權, 0表示沒有.

接下來是許可權的運算:

1. 許可權的加法, 使用與運算來實現. 我們知道, 0001 | 0100 = 0101, 這樣就表示同時具有第一位和第三位的許可權管理了, 列舉表示為:

permissions permissions = permissions.insert | permissions.update

2. 許可權的減法, 使用與運算+非運算來實現, 如上面要去掉insert許可權, 操作為:

permissions permissions &= ~permissions.insert即是 0101 & ~0001 = 0101 & 1110 = 0100

3. 許可權的判斷, 使用與運算, 當判斷用一使用者是否具有該操作許可權時, 要把使用者的的許可權與操作許可權進行與運算, 如果得到的結果仍是操作許可權管理, 則表示使用者具有該許可權:

permissions permissions = permissions.insert | permissions.update;

assert.istrue((permissions & permissions.insert) == permissions.insert);

assert.istrue((permissions & permissions.update) == permissions.update);

assert.isfalse((permissions & permissions.query) == permissions.query);

permissions &= ~permissions.delete;

assert.isfalse((permissions &= ~permissions.delete) == permissions.delete);

比較過程為 0101 & 0001 = 0001, 0001的0位用與c#位運算把其它位都置成0, 變成只比較1的這一位

<?php 

define("public_article", 1); //發行文章 

define("create_article", 2); //新增文章 

define("modify_article", 4); //修改文章 

define("delete_article", 8); //刪除文章 

define("sharch_article", 16); //搜尋文章 

//所有的許可權 

$final_allow = public_article | create_article | modify_article 

| delete_article | sharch_article | create_comment | delete_comment; 

//增加許可權使用 | 

echo "管理者擁有的全部許可權:" .decbin($final_allow). "

"; $no_shearch_allow = $final_allow ^ sharch_article; 

//刪除許可權使用 ^ 或 & ~

echo "僅無法搜尋文章的許可權:" .decbin($no_shearch_allow). "

"; //編輯人員獨有的許可權 

$editor_allow = public_article | modify_article | delete_article; 

$no_editor_allow = $final_allow & ~$editor_allow; 

echo "非編輯人員所有的許可權:" .decbin($no_editor_allow). "

"; //判斷許可權使用 & ( 是, 返回非0; 不是, 返回0) 

php 位運算與許可權,PHP中的位運算和進製處理

php中的位運算和進製是比較冷門的知識,感覺很簡單也很好理解,但是在實際場景中卻很少使用,本篇博文就是簡單了解基本概念以及講解如何去實際使用.位運算php中的位運算子是對整形進行的操作,比如對於十進位制,二進位制,八進位制等數字的一些操作.按位與 and 按位或 or 按位取反 not 按位異或 x...

位運算 之(1) 按位與(AND) 操作

由於位運算直接對記憶體資料進行操作,不需要轉成十進位制,因此處理速度非常快。按位與 bitwise and 運算符號為 a b 的操作的結果 a b中對應位同時為1,則對應結果位也為1 例如 10010001101000101011001111000 10101100000000對101011000...

C C 位操作 位運算

在c語言中,可以單獨操控變數的位 bit 一般高階語言不會處理這級別的細節,c在提供高階語言便利的同時,還能為組合語言所保留的級別上工作,這使其成為編寫裝置驅動程式和嵌入式 的首選語言。目錄 二進位制整數 binary 有符號整數 八進位制 octal 十六進製制 hex 位運算子 按位與 的用途 ...