Opération BitMask en Java

Considérez le scénario que j’ai comme valeurs assignées

Amazon -1

Walmart -2

Cible -4

Costco -8

Bjs -16

Dans DB, les données sont stockées en masquant ces valeurs en fonction de leur disponibilité pour chaque produit. par exemple.,

Description du masque

1 ordinateur portable disponible sur Amazon

17 iPhone disponible sur Amazon et BJ

24 matelas disponibles chez Costco et BJ’s

Comme ceux-ci, tous les produits sont masqués et stockés dans la firebase database.

Comment extraire tous les détaillants en fonction de la valeur masquée. Par exemple, pour Mattress, la valeur masquée est 24. Ensuite, comment pourrais-je trouver ou répertorier par programme Costco & BJ? Tout algorithme / logique serait très apprécié.

int mattress = 24; int mask = 1; for(int i = 0; i < num_stores; ++i) { if(mask & mattress != 0) { System.out.println("Store "+i+" has mattresses!"); } mask = mask << 1; } 

La déclaration if aligne les bits, si la valeur de matelas a la même valeur que le jeu de masques, le magasin dont le masque vend des matelas. Un AND de la valeur du matelas et de la valeur du masque ne sera non nul lorsque le magasin vendra des matelas. Pour chaque itération, nous déplaçons le bit de masque d'une position vers la gauche.

Notez que les valeurs du masque doivent être positives, et non négatives. Si nécessaire, vous pouvez les multiplier par des négatives.

En supposant que vous vouliez dire dans une firebase database SQL, vous pouvez généralement append par exemple WHERE (MyField AND 16) = 16, WHERE (MyField AND 24) = 24, etc.

Toutefois, notez que si vous essayez d’optimiser ces extractions et que le nombre de lignes correspondant à une requête est beaucoup plus petit que le nombre total de lignes, ce n’est probablement pas un très bon moyen de représenter ces données. Dans ce cas, il serait préférable de disposer d’une table “ProductStore” distincte contenant les paires (ProductID, StoreID) représentant cette information (et indexées sur StoreID).

Existe-t-il au plus deux détaillants dont les stocks totalisent la valeur “masquée” dans chaque cas? Si c’est le cas, vous devrez toujours vérifier toutes les paires pour les récupérer, ce qui prendra un temps supplémentaire. Utilisez simplement une boucle nestede.

Si la valeur représente la sum d’un nombre quelconque d’inventaires de détaillants, vous essayez alors de résoudre le problème de la sum des sous-ensembles . Par conséquent, vous ne pouvez malheureusement pas le faire dans un délai supérieur à deux fois.

Si vous êtes en mesure d’append à votre structure de données d’origine des informations permettant de rechercher les détaillants consortingbuant à la sum, cette option est idéale. Mais puisque vous posez la question, je suppose que vous n’avez pas access à la structure de données en cours de construction. Par conséquent, pour générer tous les sous-ensembles de détaillants à des fins de vérification, vous aurez intérêt à vous pencher sur l’algorithme de Knuth -combinaisons (et l’exécuter pour 1 … k) données dans TAOCP Vol 4a Sec 7.2.1.3.

http://www.antiifcampaign.com/

Rappelez-vous ceci. Si vous pouvez supprimer le “si” avec une autre construction (motif carte / stratégie), vous pouvez le laisser ici, sinon ce “si” est vraiment dangereux !! (F.Cirillo)

Dans ce cas, vous pouvez utiliser map of map avec opération de masque binary.

Luca