[Résolu] Equivalents de BITSET, BITCLR, BITREV, BITTST ?
berfis
Membre
Bonsoir,
Il existait dans CarbonLib des fonctions sympas (des macros peut-être) qui effectuaient des opérations sur les bits d'un entier (court, long, indifféremment). La syntaxe générale était:
FONCTION (Adresse, bitN°).
Existe-t-il (je n'ai pas trouvé) l'equivalent quelque part? Je me suis coltiné avec les ^, ~, &, |, << et je ne trouve pas cela super lisible... J'aimerais bien ne pas avoir à commenter chaque opération pour me souvenir de ce qu'elle est censée faire <_<
Quelqu'un sait-il quelque chose à ce sujet? Au pire, comment rédiger la macro?
Mots clés:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Regardes ceci - https://developer.apple.com/library/ios/releasenotes/ObjectiveC/ModernizationObjC/AdoptingModernObjective-C/AdoptingModernObjective-C.html#//apple_ref/doc/uid/TP40014150-CH1-SW6
Surtout NS_OPTIONS
Merci Joanna,
Je suis sur ces pages depuis des heures, j'en arrive à écrire des trucs comme ça:
Alors que j'aimerai avoir ça:
...
Comme ceci :
C'est pas la mort à créer :
moi, j'aime bien ça:
#define BITSET(val, index, set) (set) ? val|(1<<index) : val& (~(1<<index))
int v=0x100;
v=BITSET(v,2,YES); // -> 0x104
v=BITSET(v,2,NO); // -> 0x100
Attention mpergrand à bien rajouter des parenthèses un peu partout dans tes macros. En effet tu n'as pas mis de parenthèses autour de val ni de index, donc en particulier si tu appelles BITSET(1+3*2,2,YES) ça ne va pas faire ce que tu penses
Il aurait pu les faire lui-même... >:(
C'est la remarque que je voulais faire sur ton post précédent, mais je n'ai pas osé ::)
oui, les effets de bord habituels des macros ...
Perso, dans ce cas, je ferais plutôt une fonction inline.
J'ai assez de parenthèses?
C'est du LISP ?
Bien qu'admirateur de Douglas Hofstadter, je n'ai jamais pratiqué le Lisp
Moi, on me dit "faut mettre des parenthèses", j'en mets, hein! Je ne prends plus le risque de courroucer les Grands Anciens ou d'indisposer Cthulhu...
Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn
oui, il faut isoler chaque expression par des parenthèses pour éviter les effets de bord des macros.
Une alternative serait une fonction inline.
En C pur, dans un ficher .h, ça donnerait:
mpergand,
J'aurais tendance à préférer ta solution inline, personnellement. Même si le compilateur optimisera sans doute les deux solutions, j'ai l'impression de mieux "contrôler" ce qui se passe dans une fonction que dans la salade du #define. En plus, en termes de réutilisation, il n'y a pas photo...
Mille mercis en tout cas.
PS: j'ai besoin de ces fonctions pour contrôler l'état d'un objet (et aligner l'état d'autres objets qui dépendent de lui), les flags ne sont donc pas un caprice, mais une solution économique et extensible).