Today I saw James Padolsey ‘s blog about the result of two consecutive bitwise non-operations equivalent to the floor.

Then skiyo blog did the next test, here is my code:

1 2 3 4 5 6 7 8 9 10 11 |
$time = microtime ( 1 ) ; for ( $i = 0 ; $i <= 100000 ; $i ++ ) { ~~ 4.9 ; } echo microtime ( 1 ) - $time ; echo "<br>" ; $time = microtime ( 1 ) ; for ( $i = 0 ; $i <= 100000 ; $i ++) { Floor ( 4.9 ) ; } echo microtime, and ( . 1 ) - $ Time ; |

The result of this operation on my machine is

0.013797998428345

0.041538000106812

We can see that ~~ is almost three times faster than the floor.

But we need to know why ~~ is equivalent to the floor.

Here we need to involve a hex conversion and take a non-process.

Now we need a possible condition. Our variable is a signed integer 5.

We now give it a bitwise non-operation.

The binary of 5 is 0000 0101

Bitwise none after 1111 1010

At this time, the first sign bit 1 indicates a negative number. Negative numbers need to be inverted and +1.

The result of the other bit inversion is 000 0101 +1, and the result is 000 0110

Plus the previous symbol, it is -6.

At this time we gradually find a famous formula ~num = -(num + 1)

Go back to the above topic. If the above is not an integer and is a decimal 5.9?

Then the Zend engine will discard the binary part of the decimal part when calculating the fetch.

So ~5.9 will get -6.

Then do a bitwise non-. According to the above formula, we get 5.. This effect is the same as the floor().

What. You worry about using ~~ and leaving the floor will be a problem?

This answer is ok

For example, you can test with the following code

1 2 3 |
Echo ~~ 99999999999999.99 ; echo "<br />" ; echo floor ( 99999999999999.99 ) ; |

The result of running on my computer is

276447231

99999999999999

We can see that it is overflowing with ~~.

So in a relatively small number of operations.. still use ~~ instead of the floor.

Be aware in JavaScript and PHP. The default variables can all be signed.