Проблема вашего цикла в том, что $dec /= 2
не является целочисленным делением. Если вы напечатаете $dec
в вашем цикле, вы увидите значения 8,5, 4,25, 2,125, ... и так далее, пока в конечном итоге $dec
не станет наименьшим возможным значением двойной точности, после чего в следующем цикле оно окончательно становится 0. Хотя вы звоните round
, что должно это исправить, вы не назначаете вывод round
на $dec
, поэтому он не имеет никакого эффекта. Вероятно, предпочтительнее сделать целочисленное деление для начала. В PHP7 и выше вы можете использовать intdiv
:
$dec = intdiv($dec, 2);
Или в любой версии PHP работает простой сдвиг вправо:
$dec = $dec >> 1;
В противном случае вы можете использовать intval
, floor
или round
или (int)
приведение для преобразования результата с плавающей запятой в целое число:
$dec = intval($dec / 2);
$dec = floor($dec / 2);
$dec = round($dec / 2, 0, PHP_ROUND_HALF_DOWN);
$dec = (int)($dec / 2);
Демонстрация на 3v4l.org
Другая проблема заключается в том, что вам нужно вставить значения в строку $bin
в обратном порядке, поэтому вам нужно заменить
$bin .= $dec % 2;
с
$bin = ($dec % 2) . $bin;
Так примерный цикл будет:
$dec = 24;
$bin = null;
while($dec != 0)
{
$bin = ($dec % 2) . $bin;
$dec = $dec >> 1;
}
echo $bin . PHP_EOL;
Выход:
11000