php中的整数除法

oez*_*ezi 23 php math performance

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

任何人都可以帮我解决这个问题吗?

编辑:
感谢大家的想法,我使用rubber_boots的脚本postet测试其中一些10000000迭代,在这里你可以看到结果(3或4岁的macbook与2Ghz intel core 2 duo上的MAMP) :

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
Run Code Online (Sandbox Code Playgroud)

直到现在,位移是最快的方式,但是我会把这个问题留一天,看看是否有其他可能性...

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

cle*_*tus 33

只需将其转换为int:

$result = (int)(6 / 2);
Run Code Online (Sandbox Code Playgroud)

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

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

a / b^n = a >> n where a, b, n are integers
Run Code Online (Sandbox Code Playgroud)

所以:

a / 2 = a / 2^1 = a >> 1
Run Code Online (Sandbox Code Playgroud)

但有两点需要注意:

  1. 许多编译器/解释器会自动为您执行此操作,因此没有必要再次猜测它;

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

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


Ale*_*rMP 28

如果它除以2,最快的方法就是位移.

5>>1 = 2
6>>1 = 3
Run Code Online (Sandbox Code Playgroud)

等等等等.它的作用是将位向右移1位,从而将数字除以2而丢失其余位

1110 >> 1 =  111
1011 >> 1 =  101
1011 >> 2 =   10 //division by 4
1011 << 1 =10110 
Run Code Online (Sandbox Code Playgroud)

  • 为智能方法+1并关注计算机体系结构课程! (5认同)

XzK*_*Kto 5

嘿,我不知道我是怎么进入这个问题的,因为它似乎是从2010年开始,这不是一个真正的答案,但是由于作者似乎收集了所有方法来快速划分inegers,它可能会帮助这里的人.

我通常使用0 | 当我为自己编写快速代码时,而不是(int),因为"|" 运算符比大多数其他运算符具有情人优先级,因此您不需要额外的括号.甚至

$x=0| 0.3+0.7;
Run Code Online (Sandbox Code Playgroud)

将按预期工作,当你看到代码(至少对我来说)很容易找到,因为我只想到"= 0 |" 作为特殊运算符"set and cast to int".

因此,要添加到您的集合(这些只是转换为int的其他方式):

$c=0| $x/$y;
Run Code Online (Sandbox Code Playgroud)

$c=$x/$y % PHP_INT_MAX;
Run Code Online (Sandbox Code Playgroud)