Проверьте, содержится ли значение битовой маски в сумме многих значений битовой маски

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

// 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Я не уверен, правильно ли я это делаю.

0

Решение

замещать

(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

1

Другие решения

Других решений пока нет …