前幾天看到一段代碼
int i = GetCount(para1 | para2);
咋一看有些莫名奇妙,怎么傳參的時候帶了個或運算,其實這里面是有講究的,查閱了各方資料,QQ群里賴著大牛問,才搞明白。這個運算可以用來進行多項組合。
舉個例子,在設計權(quán)限的時候,你肯定會這樣設計,權(quán)限A,做什么,權(quán)限B,做什么,權(quán)限C,做什么...如此定義權(quán)限,在調(diào)用處理函數(shù)時,我們直接傳對應的權(quán)限Id就行,假設用戶甲有A權(quán)限,我很明確得傳權(quán)限A的Id,用戶乙有B權(quán)限,我傳B權(quán)限的Id,這樣看來似乎是合理的。但是,如果用戶丙同時有A權(quán)限和B權(quán)限怎么辦呢,你可能會說,那我定義權(quán)限的時候定個AB’的權(quán)限好了,這樣凡是同時有A和B權(quán)限的用戶傳AB’的Id就行了,我一開始也是這么想的,不過,這個做法是不推薦的,也是不巧妙的,假如還有用戶同時有ABC權(quán)限,或者BC權(quán)限,或者CD權(quán)限,那么我就什么事也不用干了,就一直在給它定義類型了。
推薦的做法是,傳參用“|”運算組合,處理用“&”運算拆分,這樣,調(diào)用者可以隨意組合,而對于處理者,則只定義最基本的單個處理“&”判斷即可。看個例子:
定義一個枚舉表示權(quán)限類型:
public enum PRivilege{ Read = 0x01, Write = 0x02, Add = 0x04, Delete = 0x08,}定義一個處理函數(shù):
public void GetPrivilege(Privilege pri){ if ((pri & Privilege.Read) == Privilege.Read) { //do something } if ((pri & Privilege.Write) == Privilege.Write) { //do something } if ((pri & Privilege.Add) == Privilege.Add) { //do something } if ((pri & Privilege.Delete) == Privilege.Delete) { //do something }} 然后在其他地方調(diào)用:... GetPrivilege(Privilege.Read); GetPrivilege(Privilege.Write); GetPrivilege(Privilege.Add); GetPrivilege(Privilege.Delete); GetPrivilege(Privilege.Read | Privilege.Write); GetPrivilege(Privilege.Write | Privilege.Add); GetPrivilege(Privilege.Read | Privilege.Write | Privilege.Add);...你會看到每次調(diào)用都會精準得執(zhí)行。為什么可以這樣呢,看我定義的枚舉,對應的值分別是
0x010x020x040x08
為什么我不定義成0x01,0x02,0x03,0x04,這是就依賴于我一開始講的“|”和“&”運算了,“|”或運算是只要有1方為1就為1,“&”與運算是兩者都為1才為1,把0x01,0x02,0x04,0x08轉(zhuǎn)成2進制就是
0001001001001000
任何兩個組合,都會在自己的位上變?yōu)?。之后再拆分,由于之前組合過,自然就能精準地定位了。比如0x1和0x8組合,組合后就是1001,那么之后通過“&”來拆分,當&0x1時就能進去,&到0x8時也能進去,像這種0x01,0x02,0x04,0x08用行話講叫“開關(guān)位”,今天在QQ群里問人被人說,哎~丟銀啊~
如此,便能以不變應萬變,組合出任意結(jié)果,真是很方便啊。新聞熱點
疑難解答