Je les ai déjà vu appelés "flags", ces masques binaires.
Au lieu de 0x002, 0x004 etc, qui sont certes très classes pour l'obfuscation mais qui sont très peu pratiques pour la lecture et la maintenance, on peut utiliser (suivant les langages), la syntaxe
1<<N
où << est l'opérateur de décalage binaire. En d'autres termes, le mot binaire (ex: 010101101) sera décalé de N bits vers la gauche, le trou étant complété par des 0 et les N premiers bits étant perdus (010101101 << 5 --> 010101101 00000 --> 01010 110100000 --> 110100000).
Donc, 1<<N correspond à la mise à 1 de tous les bits d'un mot, sauf le N ème, ce qui permet d'écrire:
can_do_this = (1 << 1); //Droit déterminé par le "flag" 1, aka, le bit 1
can_do_that = (1 << 2); //Droit déterminé par le "flag" 2, aka, le bit 2
can_do_this2 = (1 << 3); //Droit déterminé par le "flag" 3, aka, le bit 3
can_do_thattoo = (1 << 4); //Droit déterminé par le "flag" 4, aka, le bit 4
Il devient alors plus facile de savoir quel bit gère quoi et on évite des erreurs de calcul.
@Thalus
En hexadécimal, on a:
0x01 0x02 0x04 0x08 0x10 0x20...
En décimal
1 2 4 8 16 32 64
Pour les grands nombres, cela sera donc plus facile d'entrer l'hexa que le décimal:
128 256 512 1024 2048 4096 8192 16384 32768 65536 ... mais après, c'est dur de les connaitre par coeur!
0x0080 0x0100 0x0200 0x0400 0x0800 0x1000 0x2000 0x4000 0x8000...
Facile de compléter les nombres, sans même connaitre la valeur décimale par coeur
En binaire, on peut le faire également, mais c'est long (b1 b10 b100 b1000...)
D'où mon conseil: pour définir qu'une constante C est le mot binaire où tous les bits sont à 0 sauf le N-eme, utilisez "1<<N".
----
Note: certains SGDB résolvent peut-être d'eux même ce problème: si plusieurs colonnes de type "bool" se suivent, leur valeur est peut-être stockée dans un seul "champ" binaire (aka, si j'ai 8 colonnes de type "bool", cela ne prend qu'un octet de donnée dans la BDD, alors que si j'ai 9 colonnes, cela prend 2 octets car tout octet entamé est complété).
Au lieu de 0x002, 0x004 etc, qui sont certes très classes pour l'obfuscation mais qui sont très peu pratiques pour la lecture et la maintenance, on peut utiliser (suivant les langages), la syntaxe
1<<N
où << est l'opérateur de décalage binaire. En d'autres termes, le mot binaire (ex: 010101101) sera décalé de N bits vers la gauche, le trou étant complété par des 0 et les N premiers bits étant perdus (010101101 << 5 --> 010101101 00000 --> 01010 110100000 --> 110100000).
Donc, 1<<N correspond à la mise à 1 de tous les bits d'un mot, sauf le N ème, ce qui permet d'écrire:
can_do_this = (1 << 1); //Droit déterminé par le "flag" 1, aka, le bit 1
can_do_that = (1 << 2); //Droit déterminé par le "flag" 2, aka, le bit 2
can_do_this2 = (1 << 3); //Droit déterminé par le "flag" 3, aka, le bit 3
can_do_thattoo = (1 << 4); //Droit déterminé par le "flag" 4, aka, le bit 4
Il devient alors plus facile de savoir quel bit gère quoi et on évite des erreurs de calcul.
@Thalus
En hexadécimal, on a:
0x01 0x02 0x04 0x08 0x10 0x20...
En décimal
1 2 4 8 16 32 64
Pour les grands nombres, cela sera donc plus facile d'entrer l'hexa que le décimal:
128 256 512 1024 2048 4096 8192 16384 32768 65536 ... mais après, c'est dur de les connaitre par coeur!
0x0080 0x0100 0x0200 0x0400 0x0800 0x1000 0x2000 0x4000 0x8000...
Facile de compléter les nombres, sans même connaitre la valeur décimale par coeur
En binaire, on peut le faire également, mais c'est long (b1 b10 b100 b1000...)
D'où mon conseil: pour définir qu'une constante C est le mot binaire où tous les bits sont à 0 sauf le N-eme, utilisez "1<<N".
----
Note: certains SGDB résolvent peut-être d'eux même ce problème: si plusieurs colonnes de type "bool" se suivent, leur valeur est peut-être stockée dans un seul "champ" binaire (aka, si j'ai 8 colonnes de type "bool", cela ne prend qu'un octet de donnée dans la BDD, alors que si j'ai 9 colonnes, cela prend 2 octets car tout octet entamé est complété).