Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > fr.comp.lang.javascript > #3058 > unrolled thread

Décalage de bits

Started byGloops <gloops@zailes.invalid.org.invalid>
First post2016-08-09 16:03 +0200
Last post2016-08-22 23:05 +0200
Articles 5 — 3 participants

Back to article view | Back to fr.comp.lang.javascript


Contents

  Décalage de bits Gloops <gloops@zailes.invalid.org.invalid> - 2016-08-09 16:03 +0200
    Re:Décalage de bits Guiche <guiche@invalid> - 2016-08-10 05:24 +0200
    Re: Décalage de bits Olivier Miakinen <om+news@miakinen.net> - 2016-08-22 16:29 +0200
      Re: Décalage de bits Gloops <gloops@zailes.invalid.org.invalid> - 2016-08-22 20:18 +0200
        Re: Décalage de bits Olivier Miakinen <om+news@miakinen.net> - 2016-08-22 23:05 +0200

#3058 — Décalage de bits

FromGloops <gloops@zailes.invalid.org.invalid>
Date2016-08-09 16:03 +0200
SubjectDécalage de bits
Message-ID<nocns3$7kl$1@usenet.pasdenom.info>
Bonjour tout le monde,

Dans la documentation des opérateurs Javascript (chez Mozilla) je vois :

	a >> b
Décalage binaire à droite  	
Décale la représentation binaire de b bits sur la droite en ignorant les 
bits perdus.

  	a >>> b
Décalage binaire à droite en complétant avec des zéros 	
Décale la représentation binaire de b bits sur la droite en ignorant les 
bits perdus et ajoute des zéros sur la gauche.

Dans le deuxième cas, c'est clair : on ajoute des zéros à gauche, donc 
en gros ça divise la valeur par 2.

Mais dans le premier cas ?
Je décale tout vers la droite, et ce qu'il y aura à la place à gauche, 
on verra bien ?

Concrètement, sur un exemple j'ai eu le même résultat. Mais faut-il se 
méfier de risquer d'obtenir autre chose ?

Ou on aura une valeur sur Windows et une autre sur Mac ?

A propos existe-t-il la possibilité de faire tourner les bits, et de 
réinjecter à gauche le bit perdu à droite ?

Je ne saurais pas citer de mémoire, mais il me semble qu'il existe des 
cas d'application.

[toc] | [next] | [standalone]


#3063

FromGuiche <guiche@invalid>
Date2016-08-10 05:24 +0200
Message-ID<57aa9e89$1@news.stben.net>
In reply to#3058
Gloops <gloops@zailes.invalid.org.invalid> Wrote in message:
> Bonjour tout le monde,

Salut à toi,

> Dans la documentation des opérateurs Javascript (chez Mozilla) je vois :
> 
> 	a >> b
> Décalage binaire à droite  	
> Décale la représentation binaire de b bits sur la droite en ignorant les 
> bits perdus.
> 
>   	a >>> b
> Décalage binaire à droite en complétant avec des zéros 	
> Décale la représentation binaire de b bits sur la droite en ignorant les 
> bits perdus et ajoute des zéros sur la gauche.
> 
> Dans le deuxième cas, c'est clair : on ajoute des zéros à gauche, donc 
> en gros ça divise la valeur par 2.
> 
> Mais dans le premier cas ?
> Je décale tout vers la droite, et ce qu'il y aura à la place à gauche, 
> on verra bien ?

En complément à deux, garder le bit de poids fort aura pour effet
 de garder le signe en divisant par deux ;)

> Concrètement, sur un exemple j'ai eu le même résultat. Mais faut-il se 
> méfier de risquer d'obtenir autre chose ?
> 
> Ou on aura une valeur sur Windows et une autre sur Mac ?

Des mêmes nombres sur des plateformes différentes seront
 éventuellement stockés différemment mais le résultat de cette
 opération sera le même...

> A propos existe-t-il la possibilité de faire tourner les bits, et de 
> réinjecter à gauche le bit perdu à droite ?

Il existe des formules pour émuler ça.

> Je ne saurais pas citer de mémoire, mais il me semble qu'il existe des 
> cas d'application.

Pour les décalages en général ? Grapiller de l'espace avec des
 flags, diviser/multiplier rapidement par une puissance de 2 (et
 tant pis pour le reste/dépassement)...


----Android NewsGroup Reader----
http://usenet.sinaapp.com/

[toc] | [prev] | [next] | [standalone]


#3066

FromOlivier Miakinen <om+news@miakinen.net>
Date2016-08-22 16:29 +0200
Message-ID<npf28g$dng$1@cabale.usenet-fr.net>
In reply to#3058
Bonjour,

Le 09/08/2016 16:03, Gloops a écrit :
> Bonjour tout le monde,
> 
> Dans la documentation des opérateurs Javascript (chez Mozilla) je vois :
> 
> 	a >> b
> Décalage binaire à droite  	
> Décale la représentation binaire de b bits sur la droite en ignorant les 
> bits perdus.

Dans la doc de référence c'est :

11.7.2 The Signed Right Shift Operator ( >> )
<http://www.ecma-international.org/ecma-262/5.1/#sec-11.7.2>

>   	a >>> b
> Décalage binaire à droite en complétant avec des zéros 	
> Décale la représentation binaire de b bits sur la droite en ignorant les 
> bits perdus et ajoute des zéros sur la gauche.

Dans la doc de référence c'est :

11.7.3 The Unsigned Right Shift Operator ( >>> )
<http://www.ecma-international.org/ecma-262/5.1/#sec-11.7.3>

> Dans le deuxième cas, c'est clair : on ajoute des zéros à gauche, donc 
> en gros ça divise la valeur par 2.

Oui pour des nombres positifs (inférieurs à 2^31). D'ailleurs ça
donnera le même résultat dans le premier cas :
  100 >>> 1  ==  100 >> 1  ==  50

> Mais dans le premier cas ?
> Je décale tout vers la droite, et ce qu'il y aura à la place à gauche, 
> on verra bien ?

Le bit le plus à gauche d'un nombre considéré comme un entier 32 bits
sera recopié, ce qui donnera donc bien une division par 2, y compris
pour un nombre négatif :
  -100 >> 1  ==  -50

Ce n'est plus vrai avec >>> puisque ce premier bit devient un 0 :
  -100 >>> 1  ==  2147483598

> Concrètement, sur un exemple j'ai eu le même résultat. Mais faut-il se 
> méfier de risquer d'obtenir autre chose ?

Oui, pour les nombres négatifs. Si tu veux faire une division par 2^n
d'un nombre qui peut être négatif (entre -2^31 et 2^31-1), utilise
>> et pas >>>.

> Ou on aura une valeur sur Windows et une autre sur Mac ?

Non, c'est normalisé.

> A propos existe-t-il la possibilité de faire tourner les bits, et de 
> réinjecter à gauche le bit perdu à droite ?
> 
> Je ne saurais pas citer de mémoire, mais il me semble qu'il existe des 
> cas d'application.

Pas en une seule opération, mais tu peux faire ceci pour faire tourner
vers la droite r bits d'un nombre x sur n bits (n <= 32) :
 x << (n - r) + x >>> r
(à masquer avec 2^n-1 si n < 32)
((non testé))


-- 
Olivier Miakinen

[toc] | [prev] | [next] | [standalone]


#3068

FromGloops <gloops@zailes.invalid.org.invalid>
Date2016-08-22 20:18 +0200
Message-ID<npffll$dn4$2@usenet.pasdenom.info>
In reply to#3066
Le 22/08/2016 à 16:29, Olivier Miakinen a écrit :
> Bonjour,
>
> Le 09/08/2016 16:03, Gloops a écrit :
>> Bonjour tout le monde,
>>
>> Dans la documentation des opérateurs Javascript (chez Mozilla) je vois :
>>
>> 	a >> b
>> Décalage binaire à droite  	
>> Décale la représentation binaire de b bits sur la droite en ignorant les
>> bits perdus.
>
> Dans la doc de référence c'est :
>
> 11.7.2 The Signed Right Shift Operator ( >> )
> <http://www.ecma-international.org/ecma-262/5.1/#sec-11.7.2>
>
>>   	a >>> b
>> Décalage binaire à droite en complétant avec des zéros 	
>> Décale la représentation binaire de b bits sur la droite en ignorant les
>> bits perdus et ajoute des zéros sur la gauche.
>
> Dans la doc de référence c'est :
>
> 11.7.3 The Unsigned Right Shift Operator ( >>> )
> <http://www.ecma-international.org/ecma-262/5.1/#sec-11.7.3>
>
>> Dans le deuxième cas, c'est clair : on ajoute des zéros à gauche, donc
>> en gros ça divise la valeur par 2.
>
> Oui pour des nombres positifs (inférieurs à 2^31). D'ailleurs ça
> donnera le même résultat dans le premier cas :
>   100 >>> 1  ==  100 >> 1  ==  50
>
>> Mais dans le premier cas ?
>> Je décale tout vers la droite, et ce qu'il y aura à la place à gauche,
>> on verra bien ?
>
> Le bit le plus à gauche d'un nombre considéré comme un entier 32 bits
> sera recopié, ce qui donnera donc bien une division par 2, y compris
> pour un nombre négatif :
>   -100 >> 1  ==  -50
>
> Ce n'est plus vrai avec >>> puisque ce premier bit devient un 0 :
>   -100 >>> 1  ==  2147483598
>
>> Concrètement, sur un exemple j'ai eu le même résultat. Mais faut-il se
>> méfier de risquer d'obtenir autre chose ?
>
> Oui, pour les nombres négatifs. Si tu veux faire une division par 2^n
> d'un nombre qui peut être négatif (entre -2^31 et 2^31-1), utilise
>>> et pas >>>.
>
>> Ou on aura une valeur sur Windows et une autre sur Mac ?
>
> Non, c'est normalisé.
>
>> A propos existe-t-il la possibilité de faire tourner les bits, et de
>> réinjecter à gauche le bit perdu à droite ?
>>
>> Je ne saurais pas citer de mémoire, mais il me semble qu'il existe des
>> cas d'application.
>
> Pas en une seule opération, mais tu peux faire ceci pour faire tourner
> vers la droite r bits d'un nombre x sur n bits (n <= 32) :
>  x << (n - r) + x >>> r
> (à masquer avec 2^n-1 si n < 32)
> ((non testé))
>
>


Uh ... Ben tu sais quoi ? Je vais devoir relire ça à tête reposée.

[toc] | [prev] | [next] | [standalone]


#3070

FromOlivier Miakinen <om+news@miakinen.net>
Date2016-08-22 23:05 +0200
Message-ID<npfpe6$13qm$1@cabale.usenet-fr.net>
In reply to#3068
Le 22/08/2016 20:18, Gloops a écrit :
> 
> Uh ... Ben tu sais quoi ? Je vais devoir relire ça à tête reposée.

J'ai le défaut de donner souvent des explications trop compliquées
par souci d'exactitude.

Plus simplement, on peut dire que :
- l'opérateur >> fait un décalage vers la droite d'un entier signé
  en conservant le signe, et retourne un entier signé ;
- l'opérateur >>> fait un décalage vers la droite d'un entier non
  signé, et retourne un entier non signé.

Les entiers signés vont de -2147483648 à +2147483647.

Les entiers non signés vont de 0 à 4294967295.

-- 
Olivier Miakinen

[toc] | [prev] | [standalone]


Back to top | Article view | fr.comp.lang.javascript


csiph-web