^淡如清风 发表于 2014-12-2 16:06:55

位运算比对来判断用户状态怎么理解?

本帖最后由 ^淡如清风 于 2014-12-2 16:16 编辑

phpwind9.0中
有个方法如下:

class Pw {
/**
   * 位运算比对
   *
   * @param int $status 状态码
   * @param int $b 比对位置
   * @param int $len 比对位数
   * @return int
   */
    public static function getstatus($status, $b, $len = 1) {
      return $status >> --$b & (1 << $len) - 1;
    }
}

然后【用户操作数据接口】中:
class PwUser {
   
    const FETCH_MAIN = 1; //获取用户基本信息,比如帐号、邮箱
    const FETCH_DATA = 2; //获取用户数据,比如积分、发帖数等论坛统计信息
    const FETCH_INFO = 4; //获取用户基本资料
    const FETCH_ALL = 7;

    const STATUS_UNCHECK = 1;//未验证用户
    const STATUS_UNACTIVE = 2;//未激活用户
    const STATUS_BAN_AVATAR = 3;//用户被禁止头像
    const STATUS_BAN_SIGN = 4;//用户被禁止签名
   
    const STATUS_ALLOW_LOGIN_ADMIN = 5;//该用户是否后后台权限
    const STATUS_SIGN_USEUBB = 6;//该用户签名是否使用UBB
}


控制器中:
//如果已经激活

$status = $user['status']; //用户状态字段
if (!Pw::getstatus($status, PwUser::STATUS_UNACTIVE)) {
    //已经激活
}

这个如何理解呢?也就是说getstatus()这个方法如何应用?困扰很久了。

@Hex

john11 发表于 2015-3-30 17:32:48

顶,看不懂,那个了解的解释下。:lol

yuzhigang5460 发表于 2015-3-31 16:52:09

const STATUS_UNCHECK = 1;//未验证用户
    const STATUS_UNACTIVE = 2;//未激活用户
    const STATUS_BAN_AVATAR = 3;//用户被禁止头像
    const STATUS_BAN_SIGN = 4;//用户被禁止签名
   
    const STATUS_ALLOW_LOGIN_ADMIN = 5;//该用户是否后后台权限
    const STATUS_SIGN_USEUBB = 6;//该用户签名是否使用UBB

这段代码规定了每个位置表示的意义,0表示是,1表示否,
如果某个$user['status']的值为 001110,【!这里是从右到左排列,跟十进制的排位一样】 表示该用户未激活,被禁止使用头像和签名,具体十进制值为2^3 + 2^2+ 2= 14, 数据库中存的就是14。

接下来判断,该用户是否是 STATUS_UNACTIVE 状态, 使用方法:
public static function getstatus($status, $b, $len = 1) {
      return $status >> --$b & (1 << $len) - 1;
    }

Pw::getstatus($status, PwUser::STATUS_UNACTIVE)

该方法带入14这个十进制值, 也就是 001110, PwUser::STATUS_UNACTIVE的值为 2, 表示第二位指示该值的布尔值。

先将 001110右移动一位,变成 000111, 后面的 (1<< $len) -1 产生一个 11111这样的二进制, 然后做与运算, 都等于1的位则为true, 这里len默认为1, 则(1<< $len) -1 产生一个 1 这样的二进制, 记为000001,   000111 &000001 == 000001 == TRUE, 故得到 该用户没激活的信息。

如果$len 为2, 则产生一个000011的值, 则会同时检查到两位, 在这里将是未激活和禁止头像, 一次类推。

大约就是这样。~~

jadexo 发表于 2015-4-12 18:46:41

这样设计有什么优势呢?
页: [1]
查看完整版本: 位运算比对来判断用户状态怎么理解?