位操作與權限

 

第一次寫技術博客,請大家批評指正。


今天老大交個一個任務,將數據中的權限部分由以前的字符串批註改成整形,即用二進制開關來實現權限的分配。

說明:以前我們做權限也都是一個字段 Power,然後讀取它的內容,比如“登陸,修改密碼,查看日誌”,讀到什麼就說明有什麼權限,有啥權限也就寫啥漢字進去。

現在的情況是事先設定好權限和位置,做一個開關,比如,上面三個權限用三位可以了, 從右到左,依次表示 登陸,修改密碼和查看日誌,假如某用戶用三個權限則爲:111,即7;假如只有第一個和第二個權限就是 011,就是3。

實現:

1、添加一個 checkboxlist ,關於這個的添加方法,自己google一下就知道了;

2、添加權限列表:

  1. m_CheckBoxList.AddString(L"登陸");  
  2. m_CheckBoxList.AddString(L"修改密碼");  
  3. m_CheckBoxList.AddString(L"查看日誌");  

3、添加權限:


  1. typedef unsigned int RightVal;  
  2.     RightVal right =0;  
  3.     for (int i=0;i<32;i++)  
  4.     {  
  5.         if (m_CheckBoxList.GetCheck(i)==1)  
  6.         {  
  7.             right=right|((RightVal)1<<i); //或操作,哪個位置的權限被選擇了 就置1   
  8.         }  
  9.     }  
4、寫入數據庫。

同理,當你要讀取這個權限的時候,就讀出這個整數,然後判斷每一位是1還是0;

代碼如下:

  1.      //設置被選擇的多選checkbox列表   
  2. typedef unsigned int RightVal;  
  3. RightVal right = m_int;  //這個參數是從數據庫中讀取出來的   
  4. for (int i=0;i<32;i++)  
  5. {  
  6.     if (right&((RightVal)1<<i))//與操作,位置是1的說明有相應的權限   
  7.     {  
  8.         m_CheckBoxList.SetCheck(i,1);  
  9.     }  
  10. }  

其實,這裏的位操作,很靈活的,方法應該也不少,大家可以多想想。另外一個 int 是32位,這裏最多可以表示32種權限(unsigned int),所以三個權限是很浪費了哈,我就用了20多種權限.


共同學習.,共同進步..

http://blog.csdn.net/alfacuton/article/details/6764279

========================

定義權限枚舉
    [Flags]
    public enum GUIControlTypes
    {
        None=0x0,
        TaskControl=0x2,
        CommandControl=0x4,
        MapControl=0x8,
        SelectControl=0x10,
        FmControl=0x20,
        AARControl=0x40
    }
構建權限
GUIControlTypes DoControls = GUIControlTypes.AARControl | GUIControlTypes.CommandControl | GUIControlTypes.FmControl | GUIControlTypes.MapControl | GUIControlTypes.SelectControl;
InitFlashControl(DoControls);
判斷權限
if ((type & GUIControlTypes.TaskControl)==GUIControlTypes.TaskControl)
 
參考資料:
常用的位運算主要有與(&), 或(|)和非(~), 比如:
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的這一位.

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章