JeuWeb - Crée ton jeu par navigateur
Opération binaire et SQL - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Opération binaire et SQL (/showthread.php?tid=780)



Opération binaire et SQL - Seren - 09-02-2007

Pour gérer les différents états d'un personnage, je compte créer un champ unique et ensuite utiliser des masques.

Par exemple, en binaire :
Assommé --> status = 0000 0001
Empoisonné --> status = 0000 0010

En php ça donne :
Code PHP :
<?php 
define
('STUNNED', 0x01);
define('POISONNED', 0x02);

//Ensuite pour tester les cas possible

if($perso->status & STUNNED)
{
// le perso est assommé : traitement associé
}

if(
$perso->status & POISONNED)
{
// le perso est empoisonné: traitement associé
// par exemple
$perso->HP -= 5;
}
L'avantage de ce système c'est que si par exemple le statut du personnage est à 1111 1111, ça veut dire qu'il est assommé, empoisonné, en feu, malade etc.. On peut combiner les effets assez facilement.
par exemple.
Code PHP :
<?php 
$status
= STUNNED | POISONNED;


Voilà, là je suis super content du système (que j'ai pas du tout inventé Smile). Par contre là je commence à réfléchir au requête SQL associé.
Il va falloir utiliser des opération binaires comme condition !

Apparament c'est possible en utilisant &.
Miracle !
// Selectionnez tous les personnages assommés.
SELECT * FROM perso WHERE (status & STUNNED)

Par contre, là ou j'ai très peur c'est au niveau vitesse de traitement des requêtes. En effet, je vois toujours des requêtes ou on compare des égalités, différence etc. Je suppose que c'est assez rapide à traiter.

1. Est-ce que quelqu'un utilise des opérations binaires ?
2. Est-ce que ça va tellement ramer qu'il faut tout réimplémenter ?

PS : Après une reflexion de trente seconde, je ferais assez peut de selection basé sur le statut du personnage. A part peut être pour vérifier la mort du personnage. ( La mort est considéré comme un état.. définitif. Smile )

PPS : j'ai réediter mon post parce qu'a la base je pensais que & n'existait pas en mySQL et qu'il fallait utiliser une fonction BITAND() qui finallement est un truc uniquement pour SQL... Je laisse juste mon poste parce que j'ai passé dix minutes a le taper et que ça peut intéresser des gens peut être...


RE: Opération binaire et SQL - gtsoul - 09-02-2007

merci pour le système, j'en cherchais un du même genre. Je le teste des que je peux

je viens de lire dans la doc de mysql, que les jointures étaient en fait des opérations binaires. En fait c'est supralogique (au sens mathématique) :
SELECT * FROM table1, table2 WHERE p_key = f_key <=> table1.p_key & table2.f_key

Donc si il peut le faire sur des chaines de caractères, je ne vois pas pourquoi il ramerait plus sur de simples booléens, en supposant que l'interprétation du masque ne pose pas trop de temps.


RE: Opération binaire et SQL - Seren - 09-02-2007

gtsoul a écrit :merci pour le système, j'en cherchais un du même genre. Je le teste des que je peux

je viens de lire dans la doc de mysql, que les jointures étaient en fait des opérations binaires. En fait c'est supralogique (au sens mathématique) :
SELECT * FROM table1, table2 WHERE p_key = f_key <=> table1.p_key & table2.f_key

Donc si il peut le faire sur des chaines de caractères, je ne vois pas pourquoi il ramerait plus sur de simples booléens, en supposant que l'interprétation du masque ne pose pas trop de temps.

En fait ma question sur le fait que ça rame ça date de mon ancien post. En PL/SQL il faut utiliser une fonction, j'avais peur qu'un appel de fonction dans une condition puisse ralentir le bazar.
genre

SELECT * FROM TABLE WHERE BITAND(status, DEAD).

Mais je suis d'accord qu'au niveau machine faire un & ou un |, c'est aussi voir plus rapide qu'une comparaison style =, <, >.
(A priori un & binaire est beaucoup plus rapide qu'un = sur deux chaines de caractères.)


RE: Opération binaire et SQL - Shudrum - 09-02-2007

D'accord avec gtsoul, excellent ce système, faut que je m'y colle


RE: Opération binaire et SQL - Raoull - 09-02-2007

Bien vu !
J'utilisais le même principe en vb6 avec un calcul sur les bits dans des variables, et c'est vrai que c'est très pratique pour stocker des états, mais j'ai jamais pensé à utiliser ca avec php/mysql.

Maintenant au niveau performance, j'ai à vari dire aucune idée mais je pense pas que ce soit vraiement lourd. Au pire faire des tests en chronométrant Smile


RE: Opération binaire et SQL - barst - 09-02-2007

Je cherchais un principe similaire pour mes PNJ Big Grin afin d'exprimer plusieurs états en même temps.

Ca me plait ce système