日期:2014-05-17  浏览次数:20726 次

2的N次幕的权限设计遇到的算法问题
权限设计中,
每个功能对应一个值。这个值都是2的N次幕。
例如 增加=1,删除=2,修改c=4,查看=8,排序=16...32....
一个用户有权进行那些操作都会将权限值之和存入数据库中。
现在的问题是怎么把这个存入数据库的值之和解开。
先用的是

  List<int> ids = new List<int>();
            quanxianid += 1;
            while (quanxianid != 1)
            {
                quanxianid = quanxianid / 2;
                ids.Add(quanxianid);
            }
            return ids;

测试的时候发现问题了。
例如 如果权限值为15,那么这个算法没问题。 15=1+2+4+8 拥有增、删、改、查功能。
但是如果权限值为6(2+4)。拥有删除、和修改权限。这个算法就不给力了。
数学没学好。求教大牛。逆运算。如何确定一个数是由那些2的N次幕数组成。

------解决方案--------------------
int SetFlag(bool value, int bit, int number)
{
    if (value) number = number 
------解决方案--------------------
 (1 << bit) / 2;
    else number = number & ~((1 << bit) / 2);
    return mumber
}
作用是往一个整数中置指定位,比如
x = SetFlag(true, 3, 0)
x = 4 // 0000 0000 0000 0000 0000 0000 0000 0100
x = SetFlag(true, 4, x)
x = 12 // ... 1100
x = SetFlag(false, 3, x)
x = 8 // ... 1000

bool GetFlag(int bit, int number)
取得一个整数中的某一位
比如
int x = 1 // ... 0001
GetFlag(1, x) // true
GetFlag(2, x) // false