一、許可權設定
第一步, 先建立乙個列舉表示所有的許可權管理操作,接下來是許可權的運算等。
常用的位運算主要有與(&), 或(|)和非(~), 比如:
1 & 0 = 0, 1 | 0 = 1, ~1 = 0
在設計許可權時, 我們可以把許可權管理操作轉換為c#位運算來處理.
第一步, 先建立乙個列舉表示所有的許可權管理操作:
[flags]
public enum permissions
insert = 1,
delete = 2,
update = 4,
query = 8
[flags]表示該列舉可以支援c#位運算, 而列舉的每一項值, 我們用2的n次方來賦值, 這樣表示成二進位制時剛好是1 = 0001, 2 = 0010, 4 = 0100, 8 = 1000等, 每一位表示一種許可權, 1表示有該許可權, 0表示沒有.
接下來是許可權的運算:
1. 許可權的加法, 使用與運算來實現. 我們知道, 0001 | 0100 = 0101, 這樣就表示同時具有第一位和第三位的許可權管理了, 列舉表示為:
permissions per = permissions.insert | permissions.update
2. 許可權的減法, 使用與運算+非運算來實現, 如上面要去掉insert許可權, 操作為:
permissions per &= ~permissions.insert即是 0101 & ~0001 = 0101 & 1110 = 0100
3. 許可權的判斷, 使用與運算, 當判斷用一使用者是否具有該操作許可權時, 要把使用者的的許可權與操作許可權進行與運算, 如果得到的結果仍是操作許可權管理, 則表示使用者具有該許可權:
permissions per = permissions.insert | permissions.update;
if(per & permissionspermissions.insert = permissions.insert)
//有操作許可權
比較過程為 0101 & 0001 = 0001, 0001的0位用與c#位運算把其它位都置成0, 變成只比較1的這一位.
二、月份的設定
有時候需要在乙個資料表裡面儲存十二個月份中某幾個月份的標誌
這時候可以使用1個字段來代替12個字段,就要運用到十進位制來儲存月份的記錄,然後通過位運算來進行讀取和判斷
public enum monthmask
month1= 1,
month2= 2,
month3= 4,
month4= 8
乙個字段儲存12個月份的標示,高效,簡單
同樣的道理,二進位制可以用來儲存多個標示符,可以運用到很多方面
三、論壇帖子
在sql server ,採用1,2,4,8,16.....等用數字標識的狀態字段可以進行累加,對存在的幾種狀態進行組合,從而可形成各種組合狀態
例如:一條記錄該欄位原來的數字是,2,如我們想加上4,則可以用
update t_user set iflag = iflag | 4 where userid = 1
(iflag 為該欄位名)
例2:在加上4之後我們想去掉4怎麼辦呢,可以這樣實現
update t_user set iflag = iflag ^4 where userid = 1
這樣就又把4從該記錄中去掉了.
如果我們想選擇所有為2的記錄該怎麼做呢,可以這樣實現
select * from t_user where iflag &2 = 2
sql中的位運算不但可以取出各種值,而且我們可以對他對資料進行排序
舉例如下,新聞列表中的乙個字段標識為
1:置頂
2:不置頂
4:推薦
8:不推薦
該字段的值可以為這4種狀態的組合,如果我們根據一定條件想把所有置頂的放在前面該如何做呢
select * from t_news order by iflag & 1 desc
這樣我們就把所有置頂的貼子排在前面,當然這裡可以加上一定的where 條件,在where 裡也可可以加一定的位運算,
關於位運算可以查閱相應的sql 幫助
下面來講一講c#中的列舉位運算
這裡我們定義乙個列舉
[flags]
enum userflag
在**裡加上如下處理
protected void page_load(object sender, eventargs e)
}進行處理之後userflag就是資料庫中存在的各種組合
我們同樣可對其進行一定的位運算處理
如我們想加上 userflag.c 可進行如下操作
userflag = userflag | userflag.c
如想去掉userflag.c 可進行如下操作
userflag = userflag ^ userflag.c
如我們要判斷是該標識中是否存在c可進行如下操作
(userflag & userflag.c) == userflag.c
js中位運算的運用
原文 js中位運算的運用 我們可能很少在程式設計中用位運算,如果沒深入學習,可能也很難理解。平時的數值運算,其實是要先轉換成二進位制再進行運算的,而位運算就是直接進行二進位制運算,所以位運算的執行效率肯定是更高的。下面通過一些例項來加深對位運算的理解。運算子我們都知道,只有兩個都為真,結果才為真。道...
js中位運算的運用
原文 js中位運算的運用 我們可能很少在程式設計中用位運算,如果沒深入學習,可能也很難理解。平時的數值運算,其實是要先轉換成二進位制再進行運算的,而位運算就是直接進行二進位制運算,所以位運算的執行效率肯定是更高的。下面通過一些例項來加深對位運算的理解。運算子我們都知道,只有兩個都為真,結果才為真。道...
位運算的實踐運用
判斷乙個數的奇偶 var n 2n 1 0 var n 1n 1 1向下取整 1.2 1 1.8 1 1.8 0 1 1.14 0 1 1.14 0 1 1.14 0 1 不可對負數取整 2的倍數乘除法 1 2 4 1的2進製左移2位,即乘2的2次方 8 2 2 8的2進製右移2位,即除2的2次方比...