A non-numeric value encountered

108
14 ноября 2019, 23:20
$f='f';
for ($i=128; $i>0; $i=$i/2)
if ($f & $i) echo "1";
else echo "0";

Нужно проверить каждый бит символа для вывода его битового представления. Но появляется куча ошибок A non-numeric value encountered, хотя я проверяю всего 8 бит.

Answer 1

Как уже заметил Ипатьев, в вашем коде есть две ошибки. Строка 'f' преобразуется к числу неправильным образом. По умолчанию используются стандартные правила PHP, вам же нужно получить числовое представление байта с помощью функции ord.

Вторая ошибка кроется в неверном условии цикла. Попытайтесь выполнить код вручную на бумажечке, и вы увидете, что когда $i доходит до 1, то 1 / 2 == 0.5, а это больше нуля. С математической точки зрения цикл получился бы бесконечным. Но в реальности это не так, потому что точность чисел в машинном представлении ограничена, и в какой-то момент после деления получается ноль.

И да, если вы хотите научится и стать настоящим программистом, пожалуйста, форматируйте ваш код. Используйте отступы для тела цикла и условий, ставьте пробелы вокруг бинарных операторов (присваивание, деление, сравнение и т.п.) Чтобы узнать об этом подробнее, можете прочитать PEAR Coding Standards, где описывается рекомендуемый стиль кода.

$f = 'f';
for ($i = 128; $i >= 1; $i = $i / 2) {
    if (ord($f) & $i) {
        echo "1";
    } else {
        echo "0";
    }
}

Внесённые изменения я выделил жирным.

Кстати говоря, алгоритм для перевода чисел в битовое представление уже реализован функцией decbin.

$f = 'f';
echo decbin(ord($f));
Answer 2

Ошибка совершенно очевидная. В математических операциях могут участвовать только числа. Поэтому символ "f" сначала преобразуется в число по правилам РНР (и становится равным нулю), но при этом РНР совершенно справедливо сообщает тебе, что ты пытаешься совершить математическую операцию с значением, которое не является числом.

На уроке надо было не рубиться в доту, а слушать преподавателя. Тогда бы ты не пропустил функцию ord().

А вот почему ты проверяешь не 8 бит, а чуть больше тысячи - это мы тебе оставим в качестве домашнего задания.

READ ALSO
Как оформить страницу ошибки 404

Как оформить страницу ошибки 404

У меня есть сайт, зеркало другого сайта

147
Два связанных <select> без js. Возможно ли?

Два связанных <select> без js. Возможно ли?

У меня есть сейчас список <select>, который функционирует для вывода таблиц с информациейНужен ещё , который будет списком ников

131
С++ Обмен данными в локальной сети

С++ Обмен данными в локальной сети

Ситуация: Реализую программу для управления компьютерами локальной сети на С++Вопрос: Как отправить структуру данных от клиента и принять...

109