0
1
Comment déterminer la parité d'un nombre
Et avec if not odd(MonEntier) then MonEntierEstPair n'est ce pas kif-kif ?
A+.
not odd(N)
génére sur D2009 ceci :
and al,$01
xor al,$01
mais (N and 1) xor 1 n'est pas une expression booléenne !
pour la rendre booléenne il faudrait l'ecrire :
boolean((N and 1) xor 1)
Ce qui oblige a faire un transtypage, qui ne change rien à l'assembleur généré, certes, mais qui fait de l'écriture en plus pour le développeur.
par contre je crois que sur les anciennes version de delphi Odd etait une fonction donc risque de donner 4 instruction voir 5 au lieu de 2.
autre avantage, c'est que Odd n'est pas forcement dispo sur tout les langages (php, javascript par exemple), la solution AND= fonctionne donc sur tous :
php : ($N & 1 == 0)
javascript/c/perl : (N & 1 == 0)
python : (N and 1 == 0)
delphi : ((N and 1) = 0)
asm : test al,$1; setz al;
facile à retenir et à implémenter.
la solution du XOR peut par contre être pratique pour faire de la condition un sélecteur d'index dans un tableau ou liste. puisque le resultat par défaut est un entier.
const
ABool : array of TColor = ( clWhite, clBlack );
AInt : array[0..3] of TColor = (clRed, clBlue, clGreen, clYellow);
begin
Color1 := ABool[ (N and 1) = 0];
Color2 := AInt[ I + (N and 1 xor 1) ];
end;
A Dr Who :

Ok, merci, ... mais qu'est-ce-que c'est bien compliqué quand on n'y pige rien en Asm.

A+.
faut juste s'y mettre un peu.
Du moins tant qu'on comprend que, plus il y a d'instructions plus ça mets du temps et donc, moins il y en as, moins ça mets de temps, c'est déjà ça.
par exemple, si tu fait inc(I), tu obtient une seule instructions.
Et les instructions de ce type, sur un registre 32bit, tu peux considérer que tu peux en 1 seconde en faire autant que de Ghz du CPU (à quelques milliers prés).
en gros, CPU 1.8Ghz -> 1 seconde = 1 800 millions d'incrémentations possible (théorique), CPU 3Ghz -> 1 seconde = 3 milliard d'incrémentations possible.
exemple
| Code : | Sélectionner tout |
1 2 3 | var I : LongWord; for N := 0 to GetCpuFrequency-1 do inc(I); |
soit à peu prés entre 1 et 3 secondes maximum.
Les opérations sur les flottant (hors type Single) sont quasiment le double ou quadruple de temps.
Single est trés rapide car 32bits, ce n'est pas pour rien qu'il est préféré à Double dans la GDI+, OpenGL et DirectX.
A Dr Who :
OK, ça c'est clair comme de l'eau de roche.
A+.
Dans le même ordre d'idée, un pf32bit s'affiche plus de deux fois plus vite qu'un pf24bit sur un système 32 bits.
Pour toi qui fait fort dans le graphisme en ce moment, c'est bon à savoir.
A Caribensila :
Pour toi qui fait fort dans le graphisme en ce moment, c'est bon à savoir.
Super, merci pour l'info ça me permettra de faire un nettoyage dans mes units
(J'utilise Delphi-5, 32 bits sous Windows 64bits).
A+.
car 1 pixel = 1 registre = 4 octet = base d'allocation mémoire.
Si j'alloue la mémoire de 4 en 4 (ou de 2 en 2) je tomberai pile sur la taille d'une page de mémoire.
bitmap 1024*768*32bits = 768 pages
bitmap 1920*1080*32bits = 2025 pages
parcours des pixels avec les registres types EAX, EDX, ECX
bitmap 1024*768*24bits = 576 pages <- ça vas encore
bitmap 1920*1080*24bits = 1518.75 pages ! <- et voila le caca.
parcours des pixels avec les registres type ESI/EDI
Attention, avec PNG, PNG24 n'est pas purement 24Bit ! C'est un bitmap 32bit dont le 4eme octet est utilisé pour l'alpha.
donc PNG24 = BMP32.
est inutile de faire :
| Code : | Sélectionner tout |
1 2 | Bitmap.Assign(PNG); Bitmap.PixelFormat := pf32bit; // <- inutile |
Donc est nécessaire de faire :
| Code : | Sélectionner tout |
1 2 3 | JPG.DibNeeded; Bitmap.Assign(JPG); Bitmap.PixelFormat := pf32bit; |