权限设计中,
每个功能对应一个值。这个值都是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次幕数组成。
每个功能对应一个值。这个值都是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次幕数组成。
{
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;
}
A & B == A?这样子的判断比如
你的权限B:001110010
你要判断是否包含000100000的权限A,只需要
A & B 是不是等于A就行了,即
return 000100000 $ 001110010 == 000100000
{
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