IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Téléchargé 6 fois
Vote des utilisateurs
0 
1 
Détails
Licence : Non renseignée
Mise en ligne le 3 février 2013
Plate-forme : Windows
Langue : Français
Référencé dans
Navigation

Comment déterminer la parité d'un nombre

Comment déterminer la parité d'un nombre.
Avatar de Gilbert Geyer
Modérateur https://www.developpez.com
Le 04/02/2013 à 9:16
Bonjour,

Et avec if not odd(MonEntier) then MonEntierEstPair n'est ce pas kif-kif ?

A+.
Avatar de Dr.Who
Membre éprouvé https://www.developpez.com
Le 06/02/2013 à 14:07
Code : Sélectionner tout
not odd(N)
génére sur D2009 ceci :

Code asm : Sélectionner tout
1
2
3
  
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.
Code : Sélectionner tout
1
2
3
4
5
6
7
8
 
const 
  ABool : array[boolean] 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;
Avatar de Gilbert Geyer
Modérateur https://www.developpez.com
Le 06/02/2013 à 16:48
Bonjour,

A Dr Who :
Odd fonction [de Delphi1 et au moins jussqu'à D5] ... risque de donner 4 instructions voir 5 au lieu de 2.


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

A+.
Avatar de Dr.Who
Membre éprouvé https://www.developpez.com
Le 07/02/2013 à 1:29
Oh non, je disais ça aussi au départ, mais en fait c'est trés trés simple.

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);
théoriquement, il faut 1 seconde pour exécuter cette boucle hors instructions nécessaires à la boucle (1 seconde également).
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.
Avatar de Gilbert Geyer
Modérateur https://www.developpez.com
Le 07/02/2013 à 9:37
Bonjour,

A Dr Who :
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 met de temps, c'est déjà ça
.
OK, ça c'est clair comme de l'eau de roche.

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.
C'est bon à savoir, car on hésite souvent lors du choix entre les divers types de Flottants.

A+.
Avatar de Caribensila
Membre confirmé https://www.developpez.com
Le 07/02/2013 à 11:53
@Gilbert

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.
Avatar de Gilbert Geyer
Modérateur https://www.developpez.com
Le 07/02/2013 à 13:44
Bonjour,

A Caribensila :
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.

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+.
Avatar de Teddy
Membre régulier https://www.developpez.com
Le 07/02/2013 à 18:34
Merci Dr.Who, on s'améliore tous les jours grâce à des gens comme vous !
Avatar de Dr.Who
Membre éprouvé https://www.developpez.com
Le 08/02/2013 à 17:07
cari à parfaitement raison, un bitmap 32bits se gère deux fois plus rapidement qu'un bitmap 24 bits.

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
Par contre, JPEG est 24bit et = BMP24.

Donc est nécessaire de faire :

Code : Sélectionner tout
1
2
3
JPG.DibNeeded;
Bitmap.Assign(JPG);
Bitmap.PixelFormat := pf32bit;
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.