php 中的整数除法

2022-08-30 18:02:41

我正在寻找在php中进行整数除法的最快方法。例如,5 / 2应该是2,6 / 2应该是3,依此类推。如果我只是这样做,php将在第一种情况下返回2.5,我能找到的唯一解决方案是使用 - 这并不像我想要的那么快(但给出了预期的结果)。intval($my_number/2)

我该怎么做?

编辑:
感谢你们所有人的想法,我使用rubber_boots发布的脚本来测试其中一些10000000次迭代,在这里你可以看到结果(MAMP在3或4年的MacBook上,带有2Ghz Intel Core 2 duo):

start (10000000)
(int)...: 2.26 sec
floor(): 4.36 sec
int_divide(): 2.86 sec
bit-shift: 1.45 sec //note: only works for divisions through powers of 2
intval(): 4.51 sec
round() with PHP_ROUND_HALF_DOWN: 5.48 sec

到目前为止,位移是最快的方法,但我会把这个问题留出一天,看看是否有其他可能性......

EDIT2:
更新了结果,添加了带有PHP_ROUND_HALF_DOWN的round()(感谢Col._Shrapnel)


答案 1

只需将其转换为 int:

$result = (int)(6 / 2);

无论出于何种原因,它都比 快得多。intval()

编辑:假设您正在寻找一个通用的整数除法解决方案。位移是除以(或乘以)2 的幂的特殊情况。如果您对此感兴趣,那么:

a / b^n = a >> n where a, b, n are integers

所以:

a / 2 = a / 2^1 = a >> 1

但有两点需要注意:

  1. 许多编译器/解释器会自动为您执行此操作,因此没有第二次猜测的意义;

  2. 除非您在单个脚本执行中至少执行此除法100,000次,否则请不要打扰。这是一个毫无意义的微优化。

为了进一步详细说明(2),是的比,但它重要吗?几乎可以肯定不是。专注于可读的代码和良好的算法。这种事情是一种无关紧要的分心。(int)parseInt()


答案 2

如果是除以2,最快的方法是位移位。

5>>1 = 2
6>>1 = 3

等等等等。它所做的只是将位向右移1位,从而将数字除以2并丢失其余部分

1110 >> 1 =  111
1011 >> 1 =  101
1011 >> 2 =   10 //division by 4
1011 << 1 =10110 

推荐