ou encore faire le modulo d´un nombre par une valeur " remarquable" ( puissance de 2) :
nombre % 256, nombre % 1024 etc...
-> nombre & ( 256-1) soit nombre & 0xFF
etc...
le binaire sert aussi a intervertir 2 variables sans passer par une 3eme
genre pour intervertir x et y on fait
x = x ^ y;
y = x ^ y;
x = x ^ y;
bon y´en a qui ont encore dire qu´economiser 1 int, c´est negligeable mais bon... quand on connait ces petites astuces, on passe pas 10h a optimiser, c´est des " trucs" a connaitre.
si tu stock tes variables d´etat en puissance de 2
genre :
etc...
ensuite t´appelles ta fonction
truc(etat1 | etat4)
et ds la fonction elle meme
truc ( int flags)
{
}
lol ca a envoye
dc ds la fonction pr tester un champs suffit de faire un &
truc(int flags)
{
}
erf... j´ai compris, c´est quand j´appuie sur " tab" ca va sur le bouton poster message, dsl
if ( ( flags & etat4) > 0) //y´a etat4 a 1
voila j´y suis arrive
tiens ton histoire d´états ca me fait penser à un truc sympa à faire ( plutôt que des defines) :
enum etats
{
etat1 = 1,
etat2 = 2,
etat3 = 4,
etat4 = 8
};
truc ( etats flags)
{
}
a quoi ca sert ?
bin disons que le debugger de VC++ gère les enumérations et les reconnait en tant que telles. Donc lorsqu´une variable est de type enum, plutôt que de voir la valeur 1,2,4 ou 8, le debugger affichera directement " etat1", " etat2" etc... dans la variable
sympa non ?
i_am_the_law, je ne voit pas à quoi tu veux arriver...
Tu te trompe pas avec les opérateurs multibits par hazard?
truc(etat1 | etat4)
Ça ne fait pas de sens: il va OR-er le premier bit, c´est tout... le résultat sera 0001, alors que ça donnerait 1001 avec ( etat1 || etat4)...
Par contre, si tu voit le truc avec des opérateurs multibits partout, ton truc a du sens, oui, mais surtout que c´est le truc qu´utilisent les fonctions windows!
Vous savez, avec leurs constantes?
MessageBox(,,,MB_OK || MB_ICONERROR);
C´est comme ça qu´on arrive a combiner des trucs...
J´imagine que vous le saviez déjà, mais ça prouve que ça marche...
J´ai des remerciments à te faire aitonfrère: jusqu´à maintenant, je ne m´était jamais rendu compte à quel point le binaire était utile. J´était borné à me dire comme quoi les ops binaires, ça ne servait pas à grand chose, à part dans les if(), Mais visiblement, c´est vraiment fort. Merci, c´est le moindre que je puisse faire: je viens d´apprendre un truc de plus, et ça me fait bien plaisir.
Je continue à penser que l´optimisation shiftage/multiplication, c´est inutile, mais je me suis rendu compte que ce n´était pas tout.
Pour une fois, enfin un post constructif!
Kelios
---------
Kelios
---------
hum pour continuer dans ton apprentissage
je tiens à te faire remarquer quelquechose de très important ! !!
Il ne faut pas confondre les opérateurs logiques que tu utilises pour les tests ( && || ! etc...) et les opérateurs de bits.
Les opérateurs logiques sont des opérateurs te retournant le résultat de l´opération soit : vrai ou faux ( 1 ou 0).
a && b donne le résultat a AND b ( cf les définitions en logique), le résultat sera donc soit 0 soit 1.
ex: 4 && 6 donne 1
mais a & b c´est différent, cela effectuera l´opération binaire a AND b bit à bit ( hmm je sais pas comment le noter autrement)
ex: 4 & 6 donne 4 ( en binaire 100 & 110)
kelios c a croire que t´as jamais programmer... c´est l´inverse...
1000 | 0001 = 10001
MessageBox(,,,MB_OK || MB_ICONERROR);
c faux... la encore c un ou | avec une seule barre, le ou binaire et c´est ce que j´expliquais avec les etats...
enfin..
" kelios c a croire que t´as jamais programmer..."
Je suis très fatigué, je reviens d´un voyage en Espagne/Pyrénées/Provence
, et donc je suis encore sous le décalage horaire, mais je prend ça cool quand même
![]()
On a tous droit à l´erreur, et ce n´est pas parce que je me suis trompé dans mon raisonnement que nécessairement, je suis un petit newbie. Sérieusement, je trouve ça insultant; ce n´était peut-être pas ton but ( J´espère, grrr
) , mais, sérieusement, j´apprécierait que ce topic continue de rester poli, calme et relax. Voilà tout...
Je n´ai jamais vraiment fait la distiction entre les deux ops: j´ai toujours cru que l´unique était pour le tout premier bit du Low Byte, et que le double effectuait ces opérations sur tous les bits, un à la fois. Comme quoi, on peut être dans le tord depuis le tout début sans s´en être rendu compte...
En gros, ce que je croyait que faisait le double, le fait en fait le simple...
Maintenant, c´est l´histoire du Simple qui m´aggace, parce que la logique, c´est très bien, mais la machine, elle, elle s´en fout...
En pratique:
& renvoie donc 1 si les deux sont ! = de 0?
| renvoie 1 si au moins 1 des 2 ! = 0 ?
^ renvoie 1 si les deux sont différents?
Merci encore de m´éclairer
Ça fait toujours plaisir d´en apprendre plus, surtout d´un language pareil... ça fait une bonne surprise...
Kelios
---------
P.S. Soyez tolérant, je vous en prie: ce n´est pas toujours facile d´avoir l´horloge biologique réglée à votre heure, tout en ayant le monde autour de vous réglé 6 heures avant!
![]()
je suis desole si j´ai ete un peu excessif
quand tu mets qu´un seul signe, c´est l´operation bit a bit.
ca va prendre les bits 2 a 2 de chaque nombre pour les tester comme tu dis.
si par ex tu as les 2 nb ecrit en binaire et que tu fais |
1001111
0010101
ca donne
1011111
comme quand en primaire on posait les additions, on faisait d´abord les unites, ensuite les dizaines...etc
pour le ^ ca renvoie pas 1 quand l´un ou l´autre sont a 1 ( mais pas les 2 en meme temps)
voila la table :
0^0 = 0
0^1 = 1
1^0 = 1
1^1 = 1
pour le reste c´est ce que tu as dit
C´est beau pour le bit à bit, maintenant:
Les opérations booléenes telles que je les connaisse
AND
1&1=1
0&1=0
1&0=0
0&0=0
OR
1|1=1
0|1=1
1|0=1
0|0=0
XOR
1^1=0
0^1=1
1^0=1
0^0=0
Mais la vraie question est celle du Double, excusez mon erreur dans l,autre, j´y ai écrit " c´est l´histoire du Simple qui m´aggace"...
Enfin voilà: est-ce que ça marche comme je l´ai écrit? parce que dans la réalité, avec l,exemple que m´a donné aitonfrere, il n´était pas question de 1 ou de 0...
Enfin, voilou tout, merci encore pour ton ouverture d´esprit, law
Kelios
---------
ah je pensais que tu parlais du simple.
le double en fait ca marche sur le meme principe ( les meme table), sauf que chaque expression entre les signes, est evaluee a 0 ou 1
par ex ( 10>20) && ( 30<50)
ca fait 0 && 1 -> ca donne 0
dc en fait t´auras une suite genre
0 && 1 || 0 || 1 etc..
le binaire ne sert a rien. La preuve : lepremier cpu intel gere au minimun l´octet et pas le bit ! !!!!
et quand on fait if ( a | b) c plus vraiment du binaire que l´on fait puisque qu´on s´occupe carrement d´entier. certes, certains vont medire que c effectué en bit a bit. laje repond c vrai, maisd ans ce cas ( matériellement c pratiquement effectué bit a bit), l´existence du décimal et autre bases ne sont dans ce cas que virtuels.
L´expression des & ou | ne sont que des opérations logiques. Dans le domaine du C, le bit a disparu. Abstraction quand tu nous tiens.
Le remplacementde la multiplication/division par shifting est un cas tres special puisque la div/multi se fait par multiple de 2. par contre, il devient interessant de travailler uniquement sur des mots entiers du microprocesseurs. Saviez vousque certain micro vont plus vite de récupérer un entier 32 bits qu´un entier 16bits ? tout simplement parce que l´entier 32 bits est aligné en mémoire.
généralement, l´optimisation passe davantage par un changement d´algorythme plutot qu´une optimisation poussée. D´ailleur peu de compagnies passe du temps a optimiser. Malheuresement, cette optimisation est dépendante du compilateur utilisé et de la machine qui execute le code.
d´ailleur, les programmes optimisés pour 286 tourne moins vite que 486 que les progs non optimisés ! ou encore, un compilo intel préférera utiliser les flottants, et un compilo amd les entiers ( exemple K6 VS Pentium).
de toute facon, des qu´on touche au matériel et au multiplateforme, les possibilités réelles d´optimisations sont tres réduites ( en terme de trucs & astuces, le changement/amélioration de l´algorythme reste le meilleur choix)
Le meilleur moyen d´optimiser son code, c´est devori le code assembleur produit pour analyser le comportement du compilo. Généralement on s´apercoit que les compilteurs ( meme les meilleurs) ne font pas ce qui nous paraissent tres logique et qu´on doit prémacher le boulot.
style dans une boucle
for(a=0;a<10;a++){
b = a*95.75 + z;
c = a*95.75 + y;
}
le compilateur n´aura pas l´intelligence de calculer a part a*95.75 pour l´utiliser pour b et c, mais le calculera 2 fois.
c le seul type d´optimisation que je m´autorise.
Moi j´ai une regle d´or :
que nous apporte les cpu de + en plus puissants ? Moi, elle m´offre la possiblilité de coder clairement ( et donc avec moins de bug).Si nous voulions de la puissance, on programmerais tous en assembleur. C´est a la machine de faire le boulot, pas au programmeur. Les optimisations ne peuvent etre faites qu´a la condition qu´elles ne nuisent pas à la cohérence ou à la lisibilité du programme.
( je parle pour les programmes, pour les drivers le cas est différent).
Arnaud
-----------------------------------------------
Pour un monde plus propre, sans bug
en fait dans l´exemple de aitonfrere c´est pcq on considere que tout ce qui est pas 0 vaut 1
donc 4 && 6 ca vaut 1 && 1 -> 1
mais jamais on fait un truc comme ca dans un if ; )
c´est toujours des expressions vraies ou fausses a evaluer.
arnaud81 . ..
tu n´as rien compris à ce qui s´est dit sur ce topic j´ai l´impression . ...
" D´ailleur peu de compagnies passe du temps a optimiser."
mouarf ca j´en doute fort . .. pour avoir bosser dans différents secteurs ( jeux vidéo y compris), l´optimisation ( vitesse et mémoire) est une étape cruciale dans le développement ( et qui plus est sur les consoles).
As-tu seulement développé sur console ( nextgen ou non)? as-tu seulement codé ton propre compresseur ? t´est il déjà arrivé d´avoir à coder tes propres routines graphiques ( et ne pas utiliser certaines librairies) ? connais tu les principes du précalculs ?
merde j´arrive trop tard !
heureusement ke aitonfrere a vaillament défendu la valeur des operateurs binaires.
nan,nan,nan
tout ce qui a été dit sur les operateurs binaires est tres juste et tres précis
Je voulais juste dire ( fallait décrypter lol) que finalement, y a pas besoin de comprendre tour ce qui peut exister sur les operations binaires pour f if( DEFINE_1==a || DEFINE_2==b).
Amis des acharnés du binaire bonsoir !
oups, c parti tout seul....
Je voulais juste dire ( fallait décrypter lol) que finalement, y a pas besoin de comprendre tout ce qui peut exister sur les operations binaires pour mettre en place un if( DEFINE_1==a || DEFINE_2==b) ou un MessageBox(...,MB_OK|MB_autrechose) et qu´un débutant peut mettre en oeuvre des operations binaires sans savoir qu´il en fait. ( genre j´utilise sans trop comprendre). Certes ca marche, mais en codant plus pres de la machine, on peut optimiser. ( et on peut meme simplifier l´écriture parfois.