Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > fr.comp.lang.javascript > #3058 > unrolled thread
| Started by | Gloops <gloops@zailes.invalid.org.invalid> |
|---|---|
| First post | 2016-08-09 16:03 +0200 |
| Last post | 2016-08-22 23:05 +0200 |
| Articles | 5 — 3 participants |
Back to article view | Back to fr.comp.lang.javascript
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
| From | Gloops <gloops@zailes.invalid.org.invalid> |
|---|---|
| Date | 2016-08-09 16:03 +0200 |
| Subject | Dé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]
| From | Guiche <guiche@invalid> |
|---|---|
| Date | 2016-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]
| From | Olivier Miakinen <om+news@miakinen.net> |
|---|---|
| Date | 2016-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]
| From | Gloops <gloops@zailes.invalid.org.invalid> |
|---|---|
| Date | 2016-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]
| From | Olivier Miakinen <om+news@miakinen.net> |
|---|---|
| Date | 2016-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