對列舉值 Enum 進行位操作(AND OR)

2021-06-27 19:25:07 字數 2650 閱讀 5749

這裡我們可以解釋為什麼第三個值showtoolbox可以為4,5..而不能為3。

也就是說它的值不應該是前幾項值的復合值。【我的理解是 不能前幾位的和】

有乙個比較簡單的方法就是用2的n次方來依次為每一項賦值,例如 1,2,4,8,16,32,64..... 

對列舉值(enum)進行位操作(and & or)

這是我在的第一篇隨筆,其實也不能說是隨筆只能算是一篇翻譯稿,呵呵,這個就是以後我在的主要隨筆方式了。

對列舉值(enum)進行位操作(and & or)

對列舉值進行and 和 or 操作是 .net 中最不常用的功能之一,在讀了本文之後你將會發覺它其實也是乙個比較有用的功能。

在做專案的時候我們可能經常會碰到這樣一種情況:我們需要儲存一些boolean值,然後在我們定義的類裡面對應的新增乙個is***x 屬性。比如說使用者許可權物件(isadmin,isuser,ispoweruser等)。建立和檢查這樣的一些相關屬性,然後還要注意這些屬性之間的組合,隨著這樣的屬性數量的增加,我們會發覺編寫和維護**的工作量會相當的大而且容易出錯。

對於以上情況位操作(and和or)就可以相當輕鬆的進行處理,注意and和or是位操作符,他們是在數字的二進位制表示層上進行操作。

如果你對二進位制數不熟悉,請先參考相關資料。

二進位制數上的操作有很多種,我們這裡只需要用到and和or.

列舉型別(enum)中的所有值都是整數,把乙個整數用二進位制進行表示的時候,我們可以把每一位都當作是乙個boolean值,這樣乙個整數就可以來儲存乙個boolean值的列表。

為了可以方便的實現這個功能,我們規定在列舉物件當中儲存的值只能夠是2的冪。

下面我們舉個例子,我們定義乙個列舉物件來決定到底把什麼調料放在pizza上面。

< flags() > public enum toppings 『注意需要flags標記 表明是位編碼

none = 0      '務必定義乙個等於0的列舉值

pepperoni = 1

mushrooms = 2

onions    = 4

anchovies = 8

peppers   = 16

end enum

然後我們建立乙個makepizza的方法,它的輸入引數是 toppings列舉值

makepizza(usetoppings as toppings)

在makepizza方法內部我們首先定義乙個列舉變數(mytoppings),對所有我們需要的值進行or操作,然後賦值給它。

dim mytoppings as toppings 

mytoppings = mushrooms or onions or peppers

現在儲存在mytoppings中的值是22.

00000010 (mushrooms - 2)

00000100 (onions - 4)

00010000 (peppers - 16)

--------―― or

00010110 (22)

在makepizza(usetoppings as toppings)方法內部,我們需要判斷到底是什麼值產生了mytoppings(22)。

為了實現這個目的,我們把mytoppings與傳入的usetopping進行and操作。任何非零的操作結果代表乙個true值。

現在我們來測試一下,如果傳入pepperoni,

if usetoppings and toppings.pepperoni then

'新增 pepperonis

end if

操作結果是 0(false)

00010110 (usetoppings - 22)

00000001 (pepperoni - 1)

-------- and

00000000 (0)

如果傳入onions

結果是true(大於0)

00010110 (usetoppings - 22)

00000100 (onions - 4)

-------- and

00000100 (4)

通過這樣的方法,我們可以節省了儲存我們要表示的物件的儲存空間(在資料庫當中或者記憶體當中)

我們不用建立pepperoni, onions, mushrooms等的true/false列,只要儲存乙個數字22就可以了

通過這個例子,大家可以舉一反三,比如說應用在使用者許可權上面(edit, readonly, admin等)

你可以建立乙個使用者許可權的列舉,然後把他們儲存在資料庫的一列上就可以了。

我們還可以在sql語句內部充分利用這個方便性,比如說

select * from authors

where userright & p_userright > 0

我們把儲存在列userright的值和傳入引數值p_userright進行 & 操作,來判斷滿足許可權的列。

note:對於enum列舉型別我們可以利用它的tostring方法和parse方法

dim strtop as string = top.tostring()

列舉的tostring方法返回乙個列表,列表中包含所有相對應的值,值與值之間以逗號分隔;

parse方法

Enum 列舉值 (一) 獲取描述資訊

封裝了方法 public static class enumoperate public basedescriptionattribute string descriptioncn,string descriptionen base descriptioncn private string desc...

列舉進行位運算 列舉組合z

public enum myenum 用位移運算方便的獲取多個列舉的組合變數 myenum myenum myenum.myenum1 myenum.myenum2 myenum myenum myenum.myenum3 或在組合中刪除其中一項列舉 myenum myenum.myenum1 my...

C (102) 列舉型別與位域列舉Enum

定義乙個值型別,其中包含固定值集合。列舉型別變數可以是此集合中的任意乙個或多個值。列舉使用enum關鍵字來宣告,與類同級。列舉本身可以有修飾符,但列舉的成員始終是公共的,不能有訪問修飾符。列舉本身的修飾符僅能使用public和internal。顯式指定列舉的底層資料型別,如果沒有明確指定底層資料型別...