权限设计中,
每个功能对应一个值。这个值都是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次幕数组成。

解决方案 »

  1.   

    (用户的权限ID之和 & 当前功能的权限ID) 如果返回当前功能的权限ID,则证明该用户有权使用此功能。但是这个不是很好的能解决我的问题。我需要把权限ID只和分解出来。
      

  2.   

    void SetFlag(bool value, int bit, int number)
    {
        if (value) number = number | (1 << bit) / 2;
        else number = number & ~((1 << bit) / 2);
    }
    bool GetFlag(int bit, int number)
    {
        return number & (1 << bit) / 2 == number;
    }
      

  3.   

    用与或非来操作的
    A & B == A?这样子的判断比如
    你的权限B:001110010
    你要判断是否包含000100000的权限A,只需要
    A & B 是不是等于A就行了,即
    return 000100000 $ 001110010 == 000100000
      

  4.   

    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 // ... 1000bool GetFlag(int bit, int number)
    取得一个整数中的某一位
    比如
    int x = 1 // ... 0001
    GetFlag(1, x) // true
    GetFlag(2, x) // false