Voilà, j´ai pas trop compris l´utilité/fonctionnement d´une opération binaire en C++
Ca permet d´aller plus vite. Par exemple pour une multiplication par 2, c´est plus simple de faire un décalage vers la droite des bites.
1000 = 8
0100 = 6
voilà, pour le processeur ce type d´opération est plus rapide.
correction :
" Ca permet d´aller plus vite. Par exemple pour une multiplication par 2, c´est plus simple de faire un décalage vers la droite des bites. "
->
Ca permet d´aller plus vite. Par exemple pour une multiplication par 2, c´est plus simple de faire un décalage vers la > >>GAUCHE<<< des > >>BITS<<< ( restons poli!!!).
" 1000 = 8
0100 = 6"
->
1000 = 8
0100 = 4 ( !!!)
Sinon les opérations binaires sont bien plus intéressantes que ca :
- optimisation pour les calculs
- utilisation de masques
- tests logiques
- codage d´informations
- etc...
A vrai dire les opérations binaires, ça ne sert pas à grand chose, on s´en sert surtout pour l´algorithmie, génération de CD-Key, en clair c´est de l´encodage ![]()
" A vrai dire les opérations binaires, ça ne sert pas à grand chose"
! !!!!!!!!!!!!!!!!!!!!!!!!
Ah bon, c´est nouveau ca ? ? tu codes pas souvent alors . .. Arriver à un certain stade dans la programmation on ne peut pas s´en passer!!! ( enfin si on peut mais au détriment des performances...)
lol, je viens de lire que je me suis planté... j´ai été trop vite... 8/2 = 6... pitoyable... arf
" Arriver à un certain stade dans la programmation on ne peut pas s´en passer!"
Pour quoi faire? Accelerer les multiplications et divisions ?
Je ne sais pas combien coute, en cycle CPU, une multiplication par rapport a un decalage ( 20/1 pour les premier pentuim il me semble) mais es vraiment avantageux maintenant?
Si oui, je serais assez interresser par le pourquoi et le comment.
C´est pas pour critiquer cette fois ci ; ) juste pour information personnel ![]()
CoeurBrise :
Je te rappelle quand même quels sont ces opérateurs :
~ : complément à 1
< < : décalage vers la gauche
> : décalage vers la droite
& : ET logique ( AND)
^ : OU exclusif ( XOR)
| : OU inclusif ( OR)
< <= : décalage gauche + affectation
>= : décalage droit + affectation
&= : ET logique + affectation
^= : OU exclusif + affectation
|= : OU inclusif + affectation
Alors trouves moi un seul programme ( assez complet, pas un truc de débutant qui tient en 5 lignes) qui n´utilise pas un de ces opérateurs . .. ca doit exiter mais ca doit être rare à mon avis!
" Pour quoi faire? "
tu veux des exemples ? ?
EXEMPLE 1
---------
ok, alors dis moi seulement comment tu ferais pour coder un couleur, admettons sur 16 bits codée comme ceci :
xRRRRRGGGGGBBBBB
( R : red, G : green, B : blue)
Sachant que je veux la couleur 64 pour la composante R, 32 pour la couleur G, et disons 16 pour B.
Chacune de ces couleurs sont dans 3 variables : red, green, blue et je veux le résultat dans la variable color :
color = ?
Maintenant compliquons les choses, j´incrémente chacune des composantes de 1 à chaque VBL, que se passe-t-il pour ce calcul ? ( va falloir filtrer)
EXEMPLE 2
---------
Imagine maintenant une fenêtre de paramétrage avec des checkbox ( état 0 ou 1 suivant si elles sont cochées ou pas), disons qu´il y a 16 checkboxes maximum :
Comment coderais tu le paramétrage d´un utilisateur ? ?? 1 variable par checkbox ? ? baaaaaaahh!
Tu peux très bien utiliser 1 variable 16 bits et pour chacun des bits tu codes l´état des checkboxes etc...
bit 0 : état de la checkbox 1
bit 1 : état de la checkbox 2
etc . ..
Et j´en passe ! !
Je crois que optimiser avec des shiftages par rapport à des multiplications, c´est vraiment... du chippotage...
" Arriver à un certain stade dans la programmation on ne peut pas s´en passer!!! ( enfin si on peut mais au détriment des performances...)"
Bof... Ça ne s´applique qu´aux mutliplications par deux, et qu´aux divisions par deux d´entiers...
Ouais, disons qu´on y gagne par rapport à la multiplication, mais ça ne doit plus être grand chose... Tant qu´a y être, comme toujours, vaux mieux revoir notre algorithme que de passer son temps à chercher des cas particuliers pour gagner deux-trois clock cycles... vous ne trouvez pas?
Si tu passe ton temps à faire ça, et bien, ce n,est que pour le mieux, mais c´est un petit gain... à moins évidemment que ça soit, par exemple, à un endroit critique qui va se répéter 200 000 dans ton programme, dans une énorme boucle... Il est dans ce cas dans le le code à optimiser, vous savez le fameux 10% de la loi disant que 90% du temps est passé dans 10% du code?
Kelios
---------
euh pour l´exemple du RGB tiens pas compte des valeurs elles rentreront pas dans le codage ; ) mouarf j´ai plus l´habitude du 16 bits . .. mais le principe reste le même
et je REPETE ca ne sert pas qu´à optimiser les calculs ! !! c´est une facilité pour la représentation des données ( et le gain en espace mémoire non négligeable)
Oh, tu inclus les opérateurs logiques? Ah, alors là, je suis d´accord... disons que sans le AND et le OR, on irait pas loin dans les if()...
Kelios
---------
Autre exemple comment testerais tu le fait qu´un nombre entier soit pair ou impair ?
nan rien avoir avec les if...
Oui, la gestion des couleurs est un bon exemple, je n´y avais pas penser. Mais, meme pour cela ca devient de plus en plus rare. Les APIs graphiques s´en charge en general, je pense a OpenGL et SDL.
Pour l´exemple avec les checkboxs... ba, tu me connais, je ne metterais pas 1 variable par checkbox mais une instance de classe par checkbox
Il y a de la memoire alors autant l´utiliser au mieux.
Pour ma part, j´ai de la chance, mes programmes n´ont pas a etre optimisés en preformances, mais cette partie de la conception d´un programme a l´air d´etre tres interressante, y a t´il des livres recents qui en parle ?
Des livres il en existe surement, mais j´en connais pas en particulier ( je pense que tout bon bouquin qui se respecte devrait en parler). Disons que c´est à mon avis une des bases de la programmation ( quelle que soit le domaine, jeux vidéo ou autre).
Pour l´exemple des checkboxes c´est un exemple parmi tant d´autres, mais si tu voulais sauvegarder l´état de la configuration tu n´irais quand même pas sauvegarder toutes tes instances de checkbox dans un fichier non ? Autant utiliser 1 seule variable sur 16 bits ( gain d´espace sur disque et en traitement).
Je pourrais te donner des tonnes d´autres exemples dans ce genre car ils sont infinis. Personnellement je ne peux m´en passer, car ce sont des opérateurs incontournables.
Hum, ouais, t´as raison: pour ton pair/impair, je ferais:
int nombre = 67, nombre2 = 0;
if((nombre<<31)>>31)
{
//impair
}
else
{
//pair
}
Kelios
---------
bin non autant faire !
if ( nombre & 1)
{
// impair
}
else
{
// pair
}
![]()
Woops, je sais même plus pourquoi j´ai mis un nombre2... j´était surement parti sur une drole d´idée...
Kelios
---------