道歉 - 我甚至不确定我在这里使用正确的术语。
我有一系列机密文档,我正在创建一个位掩码(?)来表示给定用户可以查看哪些文档。 (1代表Doc1,2代表Doc2,4代表Doc3,8代表Doc4,16代表Doc5等)
因此,如果用户可以查看文档1,2和5,则位掩码将为19。
然而,我真的难倒的是如何反转计算位掩码中“存储”的各个值。目前,我正在使用
if($docs2view==1) {
$nextdoc = 1;
}
if($docs2view==2) {
$nextdoc = 2;
}
. . .
if($docs2view==127) {
$nextdoc = 1;
}
这真的很乏味,显然非常低效。有人能指出我正确的做法吗?
答案 0 :(得分:1)
你需要一个按位 - 和:
if( $docs2view & 1 ) {...}
if( $docs2view & 2 ) {...}
if( $docs2view & 4 ) {...}
if( $docs2view & 8 ) {...}
if( $docs2view & 16 ) {...}
在这里,我测试各个位。如果该位置位,则该条件将为非零(因此将评估为' true')。
通过将其置于循环中并使用位移运算符(>>
和<<
),可以避免大量代码重复。
你说:
谢谢你,稻田!但我只需要评估的最低值 真正。如何在发现循环后立即停止循环?
您可以将这些语句转换为elseif
,以便只有第一个变为真,或者您可以这样做(假设您只检查前8位):
$nextdoc = 0;
for( $i = 0; $i < 8; $i++ ) {
if( $docs2view & (1<<$i) ) {
$nextdoc = $i + 1;
break;
}
}