程式中位運算的運用

2021-09-06 01:34:22 字數 2501 閱讀 9184

一、許可權設定

第一步, 先建立乙個列舉表示所有的許可權管理操作,接下來是許可權的運算等。

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

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次方比...