在位掩码中计算值的简单方法?

时间:2013-05-03 03:31:27

标签: php bitmask

道歉 - 我甚至不确定我在这里使用正确的术语。

我有一系列机密文档,我正在创建一个位掩码(?)来表示给定用户可以查看哪些文档。 (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;
}

这真的很乏味,显然非常低效。有人能指出我正确的做法吗?

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;
    }
}