C# 做个用户权限管理,分五种权限。

第一种权限用2的一次方表示也就是2,第二种权限用2的二次方表示也就是4,第三种权限用2的三次方表示也就是8,第四个权限用2的四次方表示也就是16,第五个权限用2的五次方也就是32表示。权限存在数据库是一个int型的字段里。一个用户可以有多种权限,比如A用户有第二和第三种权限的话那就存2的二次方加2的三次方的和(4+8=12)的这个数表示权限二和三。现在想把所有含有第一个权限的用户列出来,怎么写这个sql语句?
2026年09月26日 11:42
有4个网友回答
网友(1):

用位操作 按位与 &
二进制
权限1 是 00001
权限2 是 00010
权限3 是 00100
权限4 是 01000
权限5 是 10000
第二和第三种权限的话那就存2的二次方加2的三次方的和(4+8=12) 是 00110
如:
有第一种权限 select * from 权限表 where 权限值&1=1
有第一种和第二种权限 select * from 权限表 where 权限值&3=3 注:3=1+2
有第三种权限 select * from 权限表 where 权限值&4=4
你自己研究一下就可以搞定
我测试成功了

网友(2):

你这个是典型的二进制数。每一位的1或0代表一个布尔值。
如你的题,第一种用2表示,就是10
第二种4表示,也就是100
一次类推。
如果在SQL中存的是Int,默认是十进制的表示形式。
我第一个想到的办法是创建一个自定义函数(如下)。这个是十进制数转换为二进制数的字符串形式,然后用LIKE去比较。

但是INT转字符串再比较肯定是比较损耗资源的。
据说SQL也有位运算。
&就是按位与。
……本机没装SQL,也没办法帮你测试……

附上int转二进制字符串:
Create FUNCTION DecToBin(@Dec Int)
RETURNS VARCHAR(16)
AS
begin
declare @BinStr as varchar(20)
declare @Mod2 as int
declare @Div2 as int

set @Div2 = @Dec / 2
set @Mod2 = @Dec % 2
set @BinStr=''

while @Div2<>0
begin
if @Mod2=0
set @BinStr = @BinStr + '0'
else
set @BinStr = @BinStr + '1'

set @Dec = @Dec / 2
set @Div2 = @Dec / 2
set @Mod2 = @Dec % 2
end

set @BinStr = @BinStr + '1'

return REVERSE(@BinStr + right('0000000000000000',16-len(@BinStr)))
end

网友(3):

SQL就实现很复杂,当然不排除有数学上的办法,但个人不记得了
所以给出程序中判断方法:
在C#通过数据库取出权限值后(假设赋值于a)
for(int i=5;i>=1;i--) //循环5-1判断是否有5-1权限
{
if(a-2^i>=0) //不为负则一定有i权限,数学方法,易证
{
有权限i; //是全部记录后在做判断(通用性强),或是到i==2时就选中(符合你的题意)
a-=2^i;
}
else
{
无权限i;
}
}
希望能帮到你

网友(4):

我不太确定这种加法和与或的关系,不过你可以验证一下,把你的权限跟0x10与或一下,如果结果是2,证明含有第一个权限。