Usando bit a bit OR 0 para establecer un número

Resuelto Alex Turpin asked hace 12 años • 7 respuestas

Un colega mío se topó con un método para establecer números flotantes usando bit a bit o:

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

Estábamos hablando de ello y preguntándonos algunas cosas.

  • ¿Como funciona? Nuestra teoría era que el uso de dicho operador convertía el número en un número entero, eliminando así la parte fraccionaria.
  • ¿Tiene alguna ventaja sobre hacerlo Math.floor? ¿Quizás sea un poco más rápido? (juego de palabras no intencionado)
  • ¿Tiene alguna desventaja? ¿Quizás no funciona en algunos casos? La claridad es obvia, ya que teníamos que resolverlo y bueno, estoy escribiendo esta pregunta.

Gracias.

Alex Turpin avatar Sep 20 '11 22:09 Alex Turpin
Aceptado

¿Como funciona? Nuestra teoría era que el uso de dicho operador convertía el número en un número entero, eliminando así la parte fraccionaria.

Todas las operaciones bit a bit, excepto el desplazamiento a la derecha sin signo, >>>funcionan en enteros de 32 bits con signo. Entonces, el uso de operaciones bit a bit convertirá un flotante en un número entero.

¿Tiene alguna ventaja sobre Math.floor? ¿Quizás sea un poco más rápido? (juego de palabras no intencionado)

http://jsperf.com/or-vs-floor/2 parece un poco más rápido

¿Tiene alguna desventaja? ¿Quizás no funciona en algunos casos? La claridad es obvia, ya que teníamos que resolverlo y bueno, estoy escribiendo esta pregunta.

  • No pasará jsLint.
  • Sólo enteros con signo de 32 bits
  • Comportamiento comparativo extraño: Math.floor(NaN) === NaN, mientras(NaN | 0) === 0
Joe avatar Sep 20 '2011 15:09 Joe

Esto es truncamiento en contraposición a piso. La respuesta de Howard es bastante correcta; Pero yo añadiría que eso Math.floorhace exactamente lo que se supone que debe hacer con respecto a los números negativos. Matemáticamente, eso es lo que es un suelo.

En el caso que describiste anteriormente, el programador estaba más interesado en truncar o eliminar completamente el decimal. Aunque, la sintaxis que usaron oscurece el hecho de que están convirtiendo el flotante en un int.

Chad La Guardia avatar Sep 20 '2011 15:09 Chad La Guardia