2010-01-29 22 views
4

我目前正在閱讀an article,但我並不真正瞭解這是如何與邏輯運算符一起工作的。任何人都可以向我解釋這個嗎?C#:enum中的按位運算符(MVC中的自定義授權)

例如。如果我想與客戶,員工,主管和管理人員共享4級證券。

[Serializable] 
[Flags] 
public enum WebRoles 
{    
    customer= 1 << 0, 
    employee= 1 << 1, 
    supervisor = 1 << 2, 
    Admin = 2 << 3 
} 

然後我該如何實現以下邏輯。

if (Roles != 0 && ((Roles & role) != role)) 
      return false; 

任何人都可以提供一些這方面的知識嗎?

非常感謝。

道明

+0

你似乎對什麼是「邏輯」和「位」運算符感到困惑。使用錯誤的術語會使您難以找到正確的信息。 – 2010-01-29 00:53:00

+0

@Anon,謝謝你。我現在明白這一點。 – 2010-01-29 12:16:45

回答

1

這個例子使用按位移位運算符: 「< <」。該操作員獲取並移動它們。例如,「1 < < 3」導致數8所以,在二進制,

customer = 0001 
employee = 0010 
supervisor = 0100 
admin =  1000 (I think this was supposed to read 1 << 3) 

現在,您可以指定人在使用按位或操作多個角色。這將是一個垂直條「|」。按位或按位組合兩個數字,設置在兩個操作數中任何一箇中設置的每個位。

myRole = customer | employee = 0011 

您擁有的if語句旨在告訴某人是否有特定的角色。它使用按位和:「&」。按位 - 組合這兩個數字,只有在兩個操作數中都設置了該位時才設置一個位。

13

他們使用enum作爲位圖:如果設置了特定位,那麼您就擁有該特權。他們也使用左移運算符。讓我嘗試所有一次證明:

 
Role   Decimal Binary Shifted Decimal 
--------  ------- ------ ------- ------- 
Customer = 1 = 000001 = 000001 = 1 
Employee = 1 = 000001 = 000010 = 2 
Supervisor = 1 = 000001 = 000100 = 4 
Admin  = 2 = 000010 = 010000 = 16 

這樣你可以結合兩個角色。例如,某些用戶可以同時播放EmployeeSupervisor,只需設置相應的位。

如何檢查一個位是否被設置?這正是(Roles & role) != role)所做的。例如:

WebRoles user = WebRoles.Employee | WebRoles.Supervisor; 
bool isEmployee = (user & WebRoles.Employee) == WebRoles.Employee; // true 

如果測試用戶變量來檢查如果Employee位被置位,即&運營商將返回所有匹配位。

希望得到這個幫助;隨意編輯這個答案