2016-07-28 29 views
0

Ich habe die folgende Beschreibung von Bitmaskenwerte:Überprüfen Sie, ob ein Bitmaskenwert in der Summe vieler bitmask enthaltenen Werte

// 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 

Hier ist ein Beispiel für die Verwendung des bitmask:

SC_ENDURE, 21

die obigen Mittel:

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

Ich habe eine CSV-Liste (zB getrimmt), um zu überprüfen, die wie folgt aussieht:

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

Was ich tun möchte, ist die Liste durchlaufen alle Effekte aus, die als Buff 16 in einer Liste betrachtet werden und die anderen in eine separate Liste.

Verwenden Sie das obige Beispiel; Wie überprüfen Sie, ob 16 in der Summe der Bitmasken 21 existiert?

Das ist, was ich bisher versucht (mit meinem Mangel an Wissen über bitmask) verbunden ist und kein Glück:

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

Der Code habe ich versucht, alle Effekte in $buff_list setzt, ich bin nicht sicher, ob ich mache ich das richtig.

Antwort

1

ersetzen

(16 | $bitmask_value) 

mit

(16 & $bitmask_value) 

bearbeiten zu verdeutlichen:

(16 | $bitmask_value) = alle Flags in &bitmask_valuesowie 16.
Beispiel: (1 | 16) = 17, ((4 | 16) | 16) = (4 | 16) = 20

(16 & $bitmask_value) = alle Flags in der &bitmask_valueauch in 16
Beispiel: (1 & 16) = 0, ((4 | 16) & 16) = 16, ((1 | 2 | 4) & (2 | 4 | 8)) = (2 | 4) = 6

+0

Ah! ! Ich war so nah. Perfekt, danke für die Erklärung, ich verstehe es jetzt. – Latheesan