设为首页
收藏本站
Archiver
用户
登录
入住
用户名
Email
自动登录
找回密码
密码
登录
入住 CI 中国社区
首页
返回 CodeIgniter 中国首页
论坛
BBS
导读
Guide
个人主页
Space
中文手册
搜索
CodeIgniter 搜索引擎
视频教程
案例
任务
搜索
搜索
本版
帖子
用户
设为首页
收藏本站
Archiver
开启辅助访问
切换到宽版
日志
相册
分享
记录
CodeIgniter4
CodeIgniter3
CodeIgniter2
帖子
好友
道具
勋章
收藏
任务
记录
留言板
设置
我的收藏
退出
腾讯QQ
微信登录
CodeIgniter 中国开发者社区
»
论坛
›
CodeIgniter 开发
›
CodeIgniter 进阶讨论
›
位运算比对来判断用户状态怎么理解?
返回列表
查看:
3074
|
回复:
3
[Others]
位运算比对来判断用户状态怎么理解?
[复制链接]
^淡如清风
^淡如清风
当前离线
积分
1010
IP卡
狗仔卡
发表于 2014-12-2 16:06:55
|
显示全部楼层
|
阅读模式
本帖最后由 ^淡如清风 于 2014-12-2 16:16 编辑
phpwind9.0中
有个方法如下:
PHP
复制代码
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
;
}
}
复制代码
然后【用户操作数据接口】中:
PHP
复制代码
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
}
复制代码
控制器中:
//如果已经激活
PHP
复制代码
$status
=
$user
[
'status'
]
;
//用户状态字段
if
(
!
Pw
::
getstatus
(
$status
,
PwUser
::
STATUS_UNACTIVE
)
)
{
//已经激活
}
复制代码
这个如何理解呢?也就是说getstatus()这个方法如何应用?困扰很久了。
@Hex
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
显身卡
john11
john11
当前离线
积分
181
IP卡
狗仔卡
发表于 2015-3-30 17:32:48
|
显示全部楼层
顶,看不懂,那个了解的解释下。
回复
支持
反对
使用道具
举报
显身卡
yuzhigang5460
yuzhigang5460
当前离线
积分
1851
IP卡
狗仔卡
发表于 2015-3-31 16:52:09
|
显示全部楼层
PHP
复制代码
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 状态, 使用方法:
PHP
复制代码
public
static
function
getstatus
(
$status
,
$b
,
$len
=
1
)
{
return
$status
>>
--
$b
&
(
1
<<
$len
)
-
1
;
}
复制代码
PHP
复制代码
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
jadexo
当前离线
积分
175
IP卡
狗仔卡
发表于 2015-4-12 18:46:41
|
显示全部楼层
这样设计有什么优势呢?
回复
支持
反对
使用道具
举报
显身卡
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
入住 CI 中国社区
本版积分规则
发表回复
回帖后跳转到最后一页