целочисленное деление в php

Outlook игнорирует padding и margin, примененные к img.

Решение состоит в том, чтобы применить padding к td, окружающему изображение.

<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="600">
  <tr>
    <td style="padding: 10px;">
      <img src="http://example.com/example.png" width="100" height="50" alt="" border="0">
    </td>
  </tr>
</table>

Удачи.

23
задан oezi 17 October 2011 в 09:41
поделиться

6 ответов

если это деление на 2, Самый быстрый способ сделать это - сдвиг бит.

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

и т. Д. И т. Д. Он просто сдвигает биты вправо на 1 бит, тем самым делит число на 2 и теряет остальные

1110 >> 1 =  111
1011 >> 1 =  101
1011 >> 2 =   10 //division by 4
1011 << 1 =10110 
28
ответ дан 29 November 2019 в 00:51
поделиться

Просто приведите его к целому числу:

$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(), но имеет ли это значение? Почти наверняка нет. Сосредоточьтесь на удобочитаемом коде и хорошем алгоритме. Подобные вещи бесполезны.

33
ответ дан 29 November 2019 в 00:51
поделиться

Просто протестируйте его:

Результат (Win32, Core2 / E6600):

 generic division (3000000)
 (int)DIV:       1.74 sec
 intval(DIV):    6.90 sec
 floor(DIV):     6.92 sec
 int_divide():   1.85 sec

 division by 2 (3000000)
 (int)(VAL/2):   1.75 sec
 VAL >> 2:       1.63 sec
 (int)(VAL*0.5): 1.72 sec

Код:

 ...
 echo "generic division ($N)\n";
 $start = getTime(); for($i=1; $i<$N; $i++) { $c = (int)(($i+1) / $i); }
 printf("(int)DIV:\t %.2f sec\n", getTime()-$start);

 $start = getTime(); for($i=1; $i<$N; $i++) { $c = intval(($i+1) / $i); }
 printf("intval(DIV):\t %.2f sec\n", getTime()-$start);

 $start = getTime(); for($i=1; $i<$N; $i++) { $c = floor(($i+1) / $i); }
 printf("floor(DIV):\t %.2f sec\n", getTime()-$start);

 $start = getTime(); for($i=1; $i<$N; $i++) { $c = ($i - ($i % ($i+1))) / ($i+1); }
 printf("int_divide():\t %.2f sec\n", getTime()-$start);

 echo "division by 2 ($N)\n";
 $start = getTime(); for($i=1; $i<$N; $i++) { $c = (int)(($i+1) / 2.0); }
 printf("(int)(VAL/2):\t %.2f sec\n", getTime()-$start);

 $start = getTime(); for($i=1; $i<$N; $i++) { $c = ($i+1) >> 2; }
 printf("VAL >> 2:\t %.2f sec\n", getTime()-$start);

 $start = getTime(); for($i=1; $i<$N; $i++) { $c = (int)(($i+1)*0.5); }
 printf("(int)(VAL*0.5):\t %.2f sec\n", getTime()-$start);
 ...

С уважением

rbo

4
ответ дан 29 November 2019 в 00:51
поделиться

round () обычно используется в таких целях. Но я понятия не имею о его скорости. У меня никогда не было миллионов вычислений в моем коде. Всего несколько десятых макс.

1
ответ дан 29 November 2019 в 00:51
поделиться

используйте функции round (), ceil () или floor (), в противном случае объявляйте тип перед, как int ()

1
ответ дан 29 November 2019 в 00:51
поделиться

Работает, только если $ x и $ y являются целыми числами

function int_divide($x, $y) {
    return ($x - ($x % $y)) / $y;
}
2
ответ дан 29 November 2019 в 00:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: