158 votes

Utilisation au niveau du bit OU 0 pour établir un nombre

Un de mes collègues suis tombé sur une méthode de plancher des nombres réels à l'aide d'un ou binaire"/":

var a = 13.6 | 0; //a == 13

Nous en parlions et vous demandez-vous un peu les choses.

  • Comment ça fonctionne? Notre théorie est que l'utilisation d'un tel opérateur jette le nombre à un nombre entier, donc enlever la partie fractionnaire
  • A-t-elle des avantages par rapport à faire Math.floor? C'est peut-être un peu plus rapide? (pas de jeu de mots destiné)
  • A-t-elle des inconvénients? Peut-être qu'il ne fonctionne pas dans certains cas? La clarté est une évidence, puisque nous avons eu à le comprendre, et bien, je suis la rédaction de cette question.

Merci.

119voto

Joe Points 34413

Comment ça fonctionne? Notre théorie est que l'utilisation d'un tel opérateur jette l' nombre à un nombre entier, donc enlever la partie fractionnaire

Toutes les opérations bit à bit, sauf unsigned décalage à droite, >>>, le travail sur l'signé nombres entiers de 32 bits. Donc, en utilisant les opérations bit à bit vous permet de convertir un float en nombre entier.

A-t-elle des avantages par rapport à faire des Mathématiques.plancher? C'est peut-être un peu plus vite? (pas de jeu de mots destiné)

http://jsperf.com/or-vs-floor/2 semble légèrement plus rapide

A-t-elle des inconvénients? Peut-être qu'il ne fonctionne pas dans certains cas? La clarté est une évidence, puisque nous avons eu à le comprendre, et bien, Je suis la rédaction de cette question.

  • De ne pas passer à jsLint.
  • Signé 32 bits des nombres entiers
  • Bizarre étude Comparative du comportement: Math.floor(NaN) === NaN, tandis que l' (NaN | 0) === 0

27voto

Chad La Guardia Points 1889

C'est la troncature par opposition au revêtement de sol. La réponse de Howard est en quelque sorte correcte. Mais j'ajouterais que Math.floor fait exactement ce qu'il est censé faire en ce qui concerne les nombres négatifs. Mathématiquement, c'est ce qu'est un plancher.

Dans le cas que vous avez décrit ci-dessus, le programmeur était plus intéressé par la troncature ou la suppression complète de la décimale. Bien que, la syntaxe qu'ils ont utilisée masque en quelque sorte le fait qu'ils convertissent le float en int.

10voto

Howard Points 23487

Votre premier point est correct. Le nombre est converti en un entier et ainsi tous les chiffres décimaux sont supprimés. Veuillez noter que Math.floor arrondit à l'entier suivant vers moins l'infini et donne ainsi un résultat différent lorsqu'il est appliqué à des nombres négatifs.

5voto

pimvdb Points 66332
  • Les spécifications disent qu'il est converti en un entier:

    Soit lnum ToInt32 (lval).

  • Performance: cela a déjà été testé sur jsperf .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: