OVH Cloud OVH Cloud

A quoi servent > pour les entiers?

31 réponses
Avatar
Michaël Delva
Bonjour,

j'ai souvent vu ces opérateurs utilisés pour des entiers, avec le terme
décalage associé, mais je ne sais pas à quoi cela sert réellement...

Une âme charitable pourrait m'éclairer?

Merci d'avance

10 réponses

1 2 3 4
Avatar
Raffaello
Bonjour,

j'ai souvent vu ces opérateurs utilisés pour des entiers, avec le terme
décalage associé, mais je ne sais pas à quoi cela sert réellement...

Une âme charitable pourrait m'éclairer?

Merci d'avance
Ca sert a decaler les bits.

par exemple :
2 en binaire : 00000010
si tu fais 2 << 1
tu as : 00000100, ce qui fait 4.
ou 2 >> 1, ca te donne 00000001, ce qui fai 1.
en fait tu decale tous les bits vers la gauche ou vers la droite du
nombre donner.
Un dernier exemple :
21 = 10101
21 << 1 = 101010 (42)
21 << 2 = 1010100 (84)
...
au final ca revien a une mutiplication par 2 pour chaque decalage.

j espere avoir ete clair.

--
Raffaello

Avatar
Michaël Delva
Raffaello wrote in news:cbphjk$ep9$:

Ca sert a decaler les bits.
par exemple :
2 en binaire : 00000010
si tu fais 2 << 1
tu as : 00000100, ce qui fait 4.
ou 2 >> 1, ca te donne 00000001, ce qui fai 1.
en fait tu decale tous les bits vers la gauche ou vers la droite du
nombre donner.
Un dernier exemple :
21 = 10101
21 << 1 = 101010 (42)
21 << 2 = 1010100 (84)
...
au final ca revien a une mutiplication par 2 pour chaque decalage.

j espere avoir ete clair.



Très clair!! Merci beaucoup...

Et pourquoi le décalage alors qu'on peut tout simplement multiplier?

Et ça ne s'utilise qu'avec des entiers?

Bref, dans quels cas utilise-t-on le décalage?

Avatar
Mathieu Roger
Et pourquoi le décalage alors qu'on peut tout simplement multiplier?



c'est vraissemblablement un "héritage" de C, qui reste très proche de
la machine
dans nombre d'assembleurs il y a une instruction spéciale pour décaler
les bits... donc si ca existe en assembleur ca existe en C et donc en C++

Avatar
Alexandre
bonjour (soir ?),

Très clair!! Merci beaucoup...

Et pourquoi le décalage alors qu'on peut tout simplement multiplier?


parce qu'en machine ce n'est pas la même opération. Un multiplieur est
BEAUCOUP plus difficile à réaliser qu'un "décaleur" qui est un simple
registre... Le C gardant une TRES FORTE liaison avec la machine conserve
donc cet opérateur...


Et ça ne s'utilise qu'avec des entiers?


oui.


Bref, dans quels cas utilise-t-on le décalage?


Sur certaines machines (mais pas obligatoirement sur tout CPU) ça va bcp +
vite qu'une multiplication. Sur un 8086, par exemple, multiplier par 2 (sur
des 16 bits) prend 170 cycles d'horloge environ, alors qu'un décalage à
gauche de 1 bit n'en prend que 2 ou 3...
Pas forcément vrai sur tout CPU, attention. Ne s'utilise AMA dans la
pratique que dans des programmes "bas niveau" où l'on fait de
l'optimisation, etc...

Avatar
Alexandre BACQUART
Michaël Delva wrote:

Bonjour,

j'ai souvent vu ces opérateurs utilisés pour des entiers, avec le terme
décalage associé, mais je ne sais pas à quoi cela sert réellement...

Une âme charitable pourrait m'éclairer?


C'est un héritage du C. Pour des entiers, cela décale les bits. Soit
sizeof(char) == 1 :

#define N 1 // nombre de décalages

unsigned char x = 71; // binaire : 01000111
unsigned char y = x << N; // décale à gauche : 10001110
unsigned char z = x >> N; // décale à droite : 00100011


Décaler les bits d'un entier a la propriété de multiplier/diviser par 2
puissance N la valeur qu'il représente. Si tu décales à gauche, tu
multiplies, si tu décales à droite tu divises.

Donc :

(x << 1) == (x * 2)
(x << 2) == (x * 4)
(x << 3) == (x * 8)
etc...

(x >> 1) == (x / 2)
etc...

Ca ne marche qu'avec des entiers et si l'opérateur est défini pour autre
chose, ça fait quelque-chose de très différent et rarement comparable.
Attention aussi aux débordements. C'est aussi une manière de ne pas
faire confiance au compilateur pour optimiser des
multiplications/divisions par des puissances de 2 en invoquant soi-même
l'opération de décalage (souvent un mnémonique dédiée du processeur).



--
Tek

Avatar
Vincent Richard

Bref, dans quels cas utilise-t-on le décalage?


[...]
Pas forcément vrai sur tout CPU, attention. Ne s'utilise AMA dans la
pratique que dans des programmes "bas niveau" où l'on fait de
l'optimisation, etc...


De toutes façons, le compilo fait l'optimisation de lui-même (et en plus il
connaît mieux les optimisations possibles pour la plate-forme cible), donc
je ne vois vraiment pas son utilité pour la multiplication aujourd'hui.

En plus, si c'est pour gagner 1 cycle horloge, alors c'est vraiment pas la
peine de se casser la tête...

Vincent

--
vmime, une bibliothèque C++ sous licence GPL pour parser et générer
des messages au format MIME : http://www.sourceforge.net/projects/vmime/


Avatar
Michaël Delva
Merci à tous pour vos éclaircissements...
Avatar
Fabien LE LEZ
On Mon, 28 Jun 2004 19:26:28 +0200, Vincent Richard
:

En plus, si c'est pour gagner 1 cycle horloge, alors c'est vraiment pas la
peine de se casser la tête...


On utilise << et >> quand on veut vraiment faire du décalage de bits,
i.e. quand on s'intéresse à la structure d'un entier.
Par exemple, si un DWORD (= entier non signé de 32 bits) contient en
fait deux WORD (= entier non signé de 16 bits), le WORD de poids fort
étant "machin" et le WORD de poids faible "truc", on écrira :

WORD machin= mon_DWORD >> 16;
Voire :
WORD machin= mon_DWORD >> (sizeof WORD * CHAR_BIT);

Ce genre de décalage de bits est utilisé également dans certains
algorithmes, comme CRC32.

En résumé, si tu veux faire une multiplication ou une division, tu
utilises * ou /, et tu laisses le compilo se depêtrer. Si un
algorithme parle de décalage de bits, tu utilises << et >>.


--
schtroumpf schtroumpf

Avatar
Richard Delorme

Sur certaines machines (mais pas obligatoirement sur tout CPU) ça va bcp +
vite qu'une multiplication. Sur un 8086, par exemple, multiplier par 2 (sur
des 16 bits) prend 170 cycles d'horloge environ, alors qu'un décalage à
gauche de 1 bit n'en prend que 2 ou 3...
Pas forcément vrai sur tout CPU, attention. Ne s'utilise AMA dans la
pratique que dans des programmes "bas niveau" où l'on fait de
l'optimisation, etc...


A mon avis, c'est surtout pratique quand on raisonne sur des bits, ce
qui peut arriver dans un algorithme. Les critères optimisation et bas
niveau sont alors secondaires. Par exemple, pour manipuler les bits d'un
entier non signé :

int getBit(unsigned int v, int n)
{
return (v >> n) & 1;
}

unsigned int setBit(unsigned int v, int n)
{
return v | (1 << n);
}

--
Richard

Avatar
Loïc Joly
Michaël Delva wrote:
Raffaello wrote in news:cbphjk$ep9$:


Ca sert a decaler les bits.
[..]



Très clair!! Merci beaucoup...

Et pourquoi le décalage alors qu'on peut tout simplement multiplier?

Et ça ne s'utilise qu'avec des entiers?

Bref, dans quels cas utilise-t-on le décalage?


Je l'ai déjà vu utilisé pour obtenir de manière portable une
représentation d'un nombre indépendante de la machine. En gros, on
extrait les bits (où les bytes) les uns après les autres, puis on les
écrit dans l'ordre qu'on veut.

--
Loïc


1 2 3 4