2016-07-28 2 views
0

У меня есть следующие спецификации значений битовых масок:Проверьте значение битового содержатся в сумме многих битовой маски значение

// Structure of Database: 
// SC_NAME, flag 
// 
// flag 1 - SC cannot be removed by death. 
//   2 - SC cannot be saved. 
//   4 - SC cannot be reset by dispell. 
//   8 - SC cannot be reset by clearance. 
//   16 - SC considered as buff and be removed by Hermode and etc. 
//   32 - SC considered as debuff and be removed by Gospel and etc. 
//   64 - SC cannot be reset when MADO Gear is taken off. 
//  128 - SC cannot be reset by 'sc_end SC_ALL' and status change clear. 
//  256 - SC can be visible for all players 

Вот пример использование битовые:

SC_ENDURE, 21

Вышеуказанные средства:

SC_ENDURE: cannot be removed by death and dispel and considered as buff. (16 + 4 + 1 = 21) 

У меня есть список CSV (обрезанный, например), чтобы проверить, что выглядит следующим образом:

SC_PROVOKE, 32 
SC_ENDURE, 21 
SC_HIDING, 4 
SC_CLOAKING, 6 
SC_TWOHANDQUICKEN, 24 
SC_CONCENTRATION, 16 
SC_ENCHANTPOISON, 16 
SC_ORCISH, 2 

То, что я хочу сделать, это пройти через список выбора все эффекты, которые считаются нагишом 16 в один список а остальные - в отдельный список.

Использование приведенного выше примера; как вы проверяете, если 16 существует в сумме бит-масок 21?

Это то, что я пытался до сих пор (с моим отсутствием знаний о битовой маске) ​​и не имея какие-либо удач:

<pre> 
<?php 

$buff_list = []; 
$not_buffs = []; 

if (($handle = fopen("data.csv", "r")) !== FALSE) { 
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
     list ($effect_code, $bitmask_value) = $data; 
     $effect_code = trim($effect_code); 
     $bitmask_value = (int)trim($bitmask_value); 
     if (16 | $bitmask_value) { 
      $buff_list[] = $effect_code; 
     } else { 
      $not_buffs[] = $effect_code; 
     } 
    } 
    fclose($handle); 
} 

print_r($buff_list); 
echo "<hr>"; 
print_r($not_buffs); 

Код я пытался это положить все эффекты в $buff_list, я не уверен, если я я делаю это правильно.

ответ

1

Заменить

(16 | $bitmask_value) 

с

(16 & $bitmask_value) 

Редактировать, чтобы помочь прояснить:

(16 | $bitmask_value) = Все флаги в &bitmask_value, а также 16.
Пример: (1 | 16) = 17, ((4 | 16) | 16) = (4 | 16) = 20

(16 & $bitmask_value) = Все флаги в &bitmask_valueтакже в 16.
Пример: (1 & 16) = 0, ((4 | 16) & 16) = 16, ((1 | 2 | 4) & (2 | 4 | 8)) = (2 | 4) = 6

+0

Ах! ! Я был так близко. Отлично, спасибо за объяснение, я понял это сейчас. – Latheesan

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