Question

Je ces indicateurs de bits possibles.

1, 2, 4, 8, 16, 64, 128, 256, 512, 2048, 4096, 16384, 32768, 65536

Ainsi, chaque numéro est comme une déclaration vrai / faux sur le côté serveur. Donc, si les 3 premiers articles, et seulement les 3 premiers éléments sont marqués « true » sur le côté serveur, le service Web retourne un 7. Ou si tous les 14 éléments ci-dessus sont vraies, je serais toujours obtenir un numéro de retour de la service Web qui est la somme de tous ces chiffres.

Quelle est la meilleure façon de gérer le nombre que je retourne à savoir quels éléments sont marqués comme « true »?

Était-ce utile?

La solution

if (7 & 1) { // if bit 1 is set in returned number (7)

}

Autres conseils

utiliser un opérateur de masquage de bit. Dans le langage C:

 X & 8

est vrai, si le bit de "8" est réglé.

Vous pouvez énumérer les masques de bits, et compter combien sont définis.

S'il est vraiment le cas que le mot entier contient des bits, et que vous voulez simplement calculer combien de bits sont, vous voulez essentiellement un « compte de la population ». L'absolu moyen le plus rapide pour obtenir un compte de la population est d'exécuter un « POPCNT » native habituellement disponible dans le jeu d'instructions de votre machine.

Si vous ne se soucient pas de l'espace, vous pouvez configurer un tableau countedbits [...] indexées par votre valeur avec un nombre de bits précalculées. Ensuite, un accès mémoire unique calcule votre nombre de bits.

Souvent utilisé est tout simplement "code de bidouilles bits" qui calcule le bit compte :

(méthode de Kernigan):

unsigned int v; // count the number of bits set in v
unsigned int c; // c accumulates the total bits set in v
for (c = 0; v; c++)
{
  v &= v - 1; // clear the least significant bit set
}

(bit parallèle summming, 32 bits)

v = v - ((v >> 1) & 0x55555555);                    // reuse input as temporary
v = (v & 0x33333333) + ((v >> 2) & 0x33333333);     // temp
c = ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24; // count

Si vous ne l'avez pas vu les hacks bidouilles bits, vous êtes dans un vrai régal.

PHP, être drôle, peut faire des choses drôles avec une partie de cette arithmétique.

La pensée la question est ancienne pourrait aider quelqu'un d'autre. Je suis en train de les nombres en binaire comme plus faciles à comprendre. Le code n'a pas été testé, mais espère que la logique est claire. Le code est spécifique PHP.

define('FLAG_A', 0b10000000000000);  
define('FLAG_B', 0b01000000000000);
define('FLAG_C', 0b00100000000000);
define('FLAG_D', 0b00010000000000);
define('FLAG_E', 0b00001000000000);
define('FLAG_F', 0b00000100000000);
define('FLAG_G', 0b00000010000000);
define('FLAG_H', 0b00000001000000);
define('FLAG_I', 0b00000000100000);
define('FLAG_J', 0b00000000010000);
define('FLAG_K', 0b00000000001000);
define('FLAG_L', 0b00000000000100);
define('FLAG_M', 0b00000000000010);
define('FLAG_N', 0b00000000000001);

function isFlagSet($Flag,$Setting,$All=false){
  $setFlags = $Flag & $Setting;
  if($setFlags and !$All) // at least one of the flags passed is set
     return true;
  else if($All and ($setFlags == $Flag)) // to check that all flags are set
     return true;
  else
     return false;
}

Utilisation:

if(isFlagSet(FLAG_A,someSettingsVariable)) // eg: someSettingsVariable = 0b01100000000010

if(isFlagSet(FLAG_A | FLAG_F | FLAG_L,someSettingsVariable)) // to check if atleast one flag is set

if(isFlagSet(FLAG_A | FLAG_J | FLAG_M | FLAG_D,someSettingsVariable, TRUE)) // to check if all flags are set

Une façon serait de boucle à travers votre numéro, de décalage gauche (ie diviser par 2) et comparez le premier bit avec 1 en utilisant le & opérande.

Comme il n'y a pas de réponse définitive avec le code php, j'ajouter cet exemple de travail:

// returns array of numbers, so for 7 returns array(1,2,4), etc..

function get_bits($decimal) {
  $scan = 1;
  $result = array();
  while ($decimal >= $scan){
    if ($decimal & $scan) $result[] = $scan;
    $scan<<=1; 
  }
  return $result;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top