2013-05-03 6 views
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; 
} 

, который ДЕЙСТВИТЕЛЬНО утомительно и явно очень неэффективен. Может ли кто-нибудь указать мне на правильный путь?

ответ

1

Вам нужно побитовое-и:

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

Здесь я тестирую отдельные биты. Если бит установлен, условие будет отличным от нуля (следовательно, будет оценено значение «true»).

Возможно, вы избежите много повторения кода, поставив это в цикле и используя операторы смены битов (>> и <<).


Вы сказали:

Спасибо, Пэдди! Но мне нужно только самое низкое значение, которое оценивает значение true. Как я могу остановить цикл, как только он обнаружит это?

Вы можете либо конвертировать эти заявления elseif так, что только первый становится правдой, или вы можете сделать это (если вы только проверить первые 8 бит):

$nextdoc = 0; 

for($i = 0; $i < 8; $i++) { 
    if($docs2view & (1<<$i)) { 
     $nextdoc = $i + 1; 
     break; 
    } 
} 
+0

Спасибо, Пэдди! Но мне нужно только самое низкое значение, которое оценивает true. Как я могу остановить цикл, как только он обнаружит это? –

+0

Я отредактировал, чтобы показать, как вы можете это сделать. – paddy

+0

Удивительный! Большое спасибо за помощь! –

Смежные вопросы