使用按位或 0 对数字取底 [英] Using bitwise OR 0 to floor a number
问题描述
A colleague of mine stumbled upon a method to floor float numbers using a bitwise or:
var a = 13.6 | 0; //a == 13
We were talking about it and wondering a few things.
- How does it work? Our theory was that using such an operator casts the number to an integer, thus removing the fractional part
- Does it have any advantages over doing
Math.floor
? Maybe it's a bit faster? (pun not intended) - Does it have any disadvantages? Maybe it doesn't work in some cases? Clarity is an obvious one, since we had to figure it out, and well, I'm writting this question.
Thanks.
How does it work? Our theory was that using such an operator casts the number to an integer, thus removing the fractional part
All bitwise operations except unsigned right shift, >>>
, work on signed 32-bit integers. So using bitwise operations will convert a float to an integer.
Does it have any advantages over doing Math.floor? Maybe it's a bit faster? (pun not intended)
http://jsperf.com/or-vs-floor/2 seems slightly faster
Does it have any disadvantages? Maybe it doesn't work in some cases? Clarity is an obvious one, since we had to figure it out, and well, I'm writting this question.
- Will not pass jsLint.
- 32-bit signed integers only
- Odd Comparative behavior:
Math.floor(NaN) === NaN
, while(NaN | 0) === 0
这篇关于使用按位或 0 对数字取底的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!