C 列舉多選的原理與實現

2021-08-13 20:31:09 字數 1717 閱讀 7557

利用列舉來傳遞多個引數實現多選。

原理其實是用2進製數的每一位來進行表示乙個列舉值,比如a=00000001,b=00000010,c=00000100三個列舉值,其實就是2的n次方,如果將a和c進行相加或者是按位與及得到表示兩個列舉值的00000101,這個代表多個值的列舉值,我們將其簡稱為多重列舉(此名字為杜撰)。原理很簡單,我們來看應用。

實現,用乙個unity中的編輯器擴充套件的例子來說明

using system;

using unityengine;

using unityeditor;

public

class maskwindow : editorwindow

public testenum testenum = testenum.typea;

public

enum testenum

testenum myenum = testenum.typea;

public

void

dosomething(testenum testenum)

array arr = enum.getvalues(typeof(testenum)); //這個會得到乙個按值大小排名的列舉陣列,如我上面typeb和typec在**上的位置調換。

for (int i = 0; i < arr.length; i++)}}

}private

void

ongui()

if (guilayout.button("debug testenum"))

}}

當然列舉在定義的時候也可以用常用的1,2,3,4自然數來進行賦值如,順便一提,如果賦值為0的話,需要在對判斷選值的時候對0進行特殊判斷 :

public

enum testenum

,只需要在判斷的時候進行手動移位,將上面判斷語句改為

testenum myenum = (testenum)arr.getvalue(i);

//進行判斷

int myenumint = 1

<< i;

uint

select = (uint)myenumint & (uint)testenum;

bool isselect = select == (uint)myenumint;

if (isselect)!

當然在傳遞「多重列舉」值的時候也沒有上面方便了,同樣需要進行位移。所以還是在定義的時候就以2的冪來賦值是很方便使用的。

int temp = 1

<< (int)testenum.typea | 1

<< (int)(testenum.typed);

dosomething((testenum)temp);

當然由於其原理的制約導致32位的uint只能表示32個列舉值。

不介意的話,可以請博主喝杯咖啡嗎?

c 列舉與位列舉

環境 c 中的列舉本質上說是乙個整數,但它同時和字串又具有對應關係,可以從vs的提示中看出 下面 演示列舉與數字和字串的相互轉換 public static void main string args 數字轉列舉 console.writeline 數字轉列舉 列舉轉字串 console.write...

WPF使用列舉作多選設定的一種實現

基礎類 public class selectitem public string value public class settingsenumlist observablecollection public static class enumextensions tolist return re...

C與C 中的列舉

1.c語言中 enum void test enum other enum week week mon 1.允許非列舉值賦值給列舉型別,允許其他列舉型別的值賦值給當前列舉型別 week 100 okweek one ok 2.列舉值具有外層作用域,容易造成名字衝突 int one 100 error...