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
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'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
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?
Raffaello <xipe@plurali.net> wrote in news:cbphjk$ep9$1@biggoron.nerim.net:
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?
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?
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++
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++
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++
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...
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...
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...
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.
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
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.
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).
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.
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
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/
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/
[...] 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/
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
On Mon, 28 Jun 2004 19:26:28 +0200, Vincent Richard
<chere-loque.MARRE-DE-LA-PUB@wanadoo.fr.invalid>:
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 >>.
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
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
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);
}
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
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
Michaël Delva wrote:
Raffaello <xipe@plurali.net> wrote in news:cbphjk$ep9$1@biggoron.nerim.net:
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.
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.