<?
//简化一下。使用数字变量,每个可容纳32个独立设置
//下面是测试例,应该很容易看懂
$b = "11111111111111111111111111111111"; // 32项权限,全1为所有权限
$a = bindec($b);
$a = $a & ~pow(2,8); // 取消第8项,以0开始:0-31
echo decbin($a)."<br>"; //11111111111111111111111011111111
$a = $a & ~(pow(2,7)|pow(2,4)|pow(2,14)|pow(2,24)); // 再取消第7、4、14、24项
echo decbin($a)."<br>"; //11111110111111111011111101101111
$a = $a + pow(2,24); // 设置第24项
echo decbin($a)."<br>"; //11111111111111111011111001101111
//判定是否有第30项权限
if($a & pow(2,30))
  echo "yes<br>";
else
  echo "no<br>";
//判定是否有第8项权限
if($a & pow(2,8))
  echo "yes<br>";
else
  echo "no<br>";?>

解决方案 »

  1.   

    <?
    //简化一下。使用数字变量,每个可容纳32个独立设置
    //下面是测试例,应该很容易看懂
    $b = "11111111111111111111111111111111"; // 32项权限,全1为所有权限
    $a = bindec($b);
    $a = $a & ~pow(2,8); // 取消第8项,以0开始:0-31
    echo decbin($a)."<br>"; //11111111111111111111111011111111
    $a = $a & ~(pow(2,7)|pow(2,4)|pow(2,14)|pow(2,24)); // 再取消第7、4、14、24项
    echo decbin($a)."<br>"; //11111110111111111011111101101111
    $a = $a + pow(2,24); // 设置第24项
    echo decbin($a)."<br>"; //11111111111111111011111001101111
    //判定是否有第30项权限
    if($a & pow(2,30))
      echo "yes<br>";
    else
      echo "no<br>";
    //判定是否有第8项权限
    if($a & pow(2,8))
      echo "yes<br>";
    else
      echo "no<br>";?>
      

  2.   

    用模块权限表的结构嘛 “用户ID,模块ID,权限级别”,如果用户能用这个模块,就加一条记录,而在模块的文件头就检查该登陆用户ID能否用该模块ID即可。
    而如果用户多,还最好先用户属于什么组,什么组能用什么模块这样的逻辑结构~~~
    用逻辑运算是能体现检验时候的算法优势,但是就是添加减少系统模块的时候比较麻烦
      

  3.   

    to xuzuning(唠叨)
    bindec最多好像只能转换31位1,那么第32位无效。
    位运算的确比较快to flydreams()
    不错的想法。先对模块进行控制,再对模块之内的小权限用唠叨的办法进行控制,可以控制上百项权限,很不错。to freeantfly(自由蚂蚁) 
    实际上就是这样做的。
      

  4.   

    to ustb: 好办法! 这样是在灵活性与效率上有了平衡了!