Javascript

Using bitwise OR 0 to floor a number

20 September 2026 · 8 min read

Using bitwise OR 0 to floor a number

Have you ever needed to quickly get the integer part of a number in JavaScript without using functions like Math.floor()? There’s a clever trick involving bitwise operators that can achieve this: using bitwise OR 0 to floor a number. This technique leverages the way JavaScript handles bitwise operations, effectively truncating the decimal portion of a number. While it might seem cryptic at first, understanding how this works can be a valuable addition to your JavaScript toolkit. This method is often faster than Math.floor() for certain JavaScript engines, and it showcases a deeper understanding of how numbers are represented and manipulated at a lower level. We’ll explore the mechanics, performance considerations, and use cases of this technique, providing you with a comprehensive guide to mastering this bitwise operation. It’s important to note that while effective, readability should always be considered when choosing between this method and more conventional approaches.

Understanding Bitwise OR and Type Conversion

The bitwise OR operator (|) performs a binary OR operation on the operands. This means it compares the corresponding bits of two numbers and sets the resulting bit to 1 if either of the original bits is 1. When you perform a bitwise OR with 0, you might expect the number to remain unchanged. However, JavaScript’s bitwise operators implicitly convert the operands to 32-bit integers. This conversion is the key to using bitwise OR 0 to floor a number.

JavaScript uses a 64-bit floating-point representation for numbers (double-precision floating-point format). When a bitwise operation is applied, this number is coerced into a 32-bit integer. Any fractional part is simply discarded during this conversion, effectively performing a floor operation. The result is then converted back to a 64-bit floating-point number, but without the decimal portion. This implicit truncation is what makes this technique so effective. The bitwise OR operator only works up to 231 - 1 (2147483647), which is the maximum value for a signed 32-bit integer. Numbers outside this range will not be floored correctly.

For example, let’s consider the number 5.7. When you perform 5.7 | 0, JavaScript first converts 5.7 to a 32-bit integer, resulting in 5. Then, it performs the bitwise OR operation with 0, which doesn’t change the value. Finally, it converts the result back to a 64-bit floating-point number, which is 5.0. This process effectively floors the original number. According to a study on JavaScript performance optimizations, bitwise operations can sometimes offer speed improvements in certain scenarios, particularly when dealing with integer-based calculations. JSTips highlights this performance aspect.

Practical Examples and Use Cases

Using bitwise OR 0 to floor a number isn’t just a theoretical exercise; it has several practical applications. One common use case is in graphics programming, where you might need to convert floating-point coordinates to integer pixel positions. Another example is when dealing with array indices, which must be integers. Suppose you’re calculating an index based on some formula that results in a floating-point number; you can use this technique to ensure you have a valid integer index.

Consider a scenario where you’re building a game and need to determine which cell in a grid a player is located in. The player’s position might be represented as floating-point coordinates. To find the corresponding cell index, you can use the bitwise OR operator to floor the coordinates: const cellX = playerX | 0; const cellY = playerY | 0;. This gives you the integer coordinates of the cell. This method is faster than using Math.floor() when performance is crucial.

Here’s another example. Imagine you’re working with a financial application and need to calculate the number of whole units of a stock someone can buy with a given amount of money. You can divide the money by the stock price and then use the bitwise OR operator to floor the result: const units = (money / stockPrice) | 0;. This ensures you only get the number of whole units, discarding any fractional part. The result is the number of stocks that can be purchased completely. This demonstrates the usefulness of the bitwise OR in real-world coding situations.

Performance Considerations and Alternatives

While using bitwise OR 0 to floor a number can be faster than Math.floor() in some JavaScript engines, it’s essential to consider performance across different environments. Modern JavaScript engines are highly optimized, and the performance difference might be negligible in many cases. Furthermore, the performance benefits can vary depending on the specific browser and hardware. According to benchmarks, the performance benefits of using bitwise operators for flooring are becoming less significant with modern JavaScript engines due to improved optimizations in Math.floor. For more information on performance benchmarks and optimizations, see this article.

Readability is also a crucial factor. While the bitwise OR trick might be faster, it’s less obvious in its intent compared to Math.floor(). Code should be easy to understand and maintain, especially in collaborative projects. If the performance difference is minimal, it’s often better to use Math.floor() for clarity. There are other alternatives as well. Math.trunc() removes the fractional part of a number (truncating it towards zero), which is different from Math.floor() for negative numbers. For example, Math.trunc(-5.7) returns -5, while Math.floor(-5.7) returns -6.

Ultimately, the best approach depends on the specific requirements of your project. If performance is critical and you’ve verified that the bitwise OR trick provides a significant speedup in your target environment, it might be a worthwhile optimization. However, always prioritize readability and maintainability unless performance bottlenecks demand otherwise. Here’s a summary of when to consider the bitwise OR method:

  • When performance is absolutely critical and micro-optimizations are necessary.
  • When working with legacy codebases where this technique is already used.

And here’s when to favor alternatives like Math.floor(): - When readability and maintainability are paramount.

  • When the performance difference is negligible.
  • When dealing with numbers outside the 32-bit integer range.

Step-by-Step Guide and Limitations

To effectively use the bitwise OR operator for flooring, follow these steps:

  1. Identify the floating-point number you want to floor.
  2. Apply the bitwise OR operator with 0: number | 0.
  3. Store the result in a variable or use it directly in your calculation.

For example: let flooredValue = 12.34 | 0; will result in flooredValue being equal to 12. This technique is straightforward to implement and can be easily integrated into your existing code. Remember to consider the limitations regarding the 32-bit integer range.

However, it’s crucial to be aware of the limitations. As mentioned earlier, the bitwise OR operator only works correctly for numbers within the range of a 32-bit signed integer (-231 to 231 - 1). If you use this technique with numbers outside this range, the results might be unexpected. For example, 2147483648 | 0 will not return 2147483648. Also, this method only floors the number towards zero. It doesn’t round the number to the nearest integer. For negative numbers, it behaves the same as Math.trunc(), not Math.floor(). For example, -5.7 | 0 evaluates to -5, while Math.floor(-5.7) evaluates to -6. Always test your code thoroughly to ensure it behaves as expected, especially when dealing with edge cases or potentially large numbers. According to Mozilla Developer Network, it’s crucial to understand the limitations of bitwise operators. MDN Web Docs offers comprehensive documentation.

Infographic here
FAQ ---
Why does using bitwise OR 0 floor a number?
Because JavaScript bitwise operators convert operands to 32-bit integers, discarding the decimal portion.
Is this method faster than `Math.floor()`?
Potentially, but the difference might be negligible in modern JavaScript engines, and it depends on the environment.
What are the limitations of this technique?
It only works correctly for numbers within the 32-bit signed integer range and behaves like `Math.trunc()` for negative numbers.
When should I use this technique?
When performance is critical and you've verified that it provides a significant speedup in your target environment, otherwise prefer `Math.floor()` for readability.
**Using bitwise OR 0 to floor a number** is a powerful technique that reveals the inner workings of JavaScript's number representation and bitwise operations. While it offers potential performance benefits in specific scenarios, remember to prioritize readability and maintainability. Choose the method that best suits your project's needs, considering both performance and clarity. Always be mindful of the limitations regarding the 32-bit integer range and the behavior with negative numbers. Ready to dive deeper into JavaScript performance optimization? Consider exploring other bitwise operators and their applications, or investigate different techniques for numerical computations. For further reading on JavaScript optimization, check out this article on web.dev: [Optimizing JavaScript](https://web.dev/optimizing-javascript/).

Question & Answer :
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 writing 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