0

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

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

这真的很乏味,而且显然效率很低。有人可以指出我正确的方法吗?

4

1 回答 1

1

你需要一个位与:

if( $docs2view & 1 ) {...}
if( $docs2view & 2 ) {...}
if( $docs2view & 4 ) {...}
if( $docs2view & 8 ) {...}
if( $docs2view & 16 ) {...}

在这里,我正在测试各个位。如果设置了该位,则条件将非零(因此将评估为“真”)。

您可以通过将其放入循环并使用位移运算符(>><<)来避免大量代码重复。


你说:

谢谢你,稻谷!但我只需要评估为真的最低值。我如何告诉循环一旦发现就停止?

您可以将这些语句转换为elseif只有第一个为真,或者您可以这样做(假设您只检查前 8 位):

$nextdoc = 0;

for( $i = 0; $i < 8; $i++ ) {
    if( $docs2view & (1<<$i) ) {
        $nextdoc = $i + 1;
        break;
    }
}
于 2013-05-03T03:37:25.133 回答