位操作与权限

 

第一次写技术博客,请大家批评指正。


今天老大交个一个任务,将数据中的权限部分由以前的字符串批注改成整形,即用二进制开关来实现权限的分配。

说明:以前我们做权限也都是一个字段 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的这一位.

 

 


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