Для тех ,кто решил зарегистрироваться на форуме «Беседка» !
Категорически запрещена регистрация  с одноразового и временного e-mail !Такие пользователи будут отправляться в бан без объяснения причин.
После регистрации необходимо активировать свою учетную запись .Если Вы в почте не обнаружили письмо с активацией рекомендуется проверить папку «Спам».
С уважением
 Администрация форума

* Недавно обновленные темы

Автор Тема: Помогите синтаксис выражения разобрать  (Прочитано 110 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн kaktus

  • Завхоз, а не админ)
  • *
  • Сообщений: 934

Привет всем)) есть у нас тут программеры)
если есть помогите разобрать синтаксис выражения
этого
$row['id_member'] == $user_info['id'] & $row['deleted'] == 1

и этого
$context['display_mode'] = $cur_profile['pm_prefs'] & 3;

что то помню из курса програмировании о логическом И.. о двоичном сравнении..
нашел вот такое вот в инете.
вот такой вот код
$values = array(0, 1, 2, 4, 8);
$test = 1 + 4;

echo "\n Побитовое И (AND) \n";
foreach ($values as $value) {
    $result = $value & $test;
    printf($format, $result, $value, '&', $test);
}

выдает вот такой вот результат
 ---------     ---------  -- ---------
 результат     значение   оп   тест
 ---------     ---------  -- ---------
 Побитовое И (AND)
( 0 = 0000) = ( 0 = 0000) & ( 5 = 0101)
( 1 = 0001) = ( 1 = 0001) & ( 5 = 0101)
( 0 = 0000) = ( 2 = 0010) & ( 5 = 0101)
( 4 = 0100) = ( 4 = 0100) & ( 5 = 0101)
( 0 = 0000) = ( 8 = 1000) & ( 5 = 0101)

но все равно не могу разобрать те два выражения)

Оффлайн технарь

  • *
  • Сообщений: 3805
  • Пол: Мужской

Помогите синтаксис выражения разобрать
« Ответ #1 : 29 Ноябрь 2016, 22:53 »
Второе выражение в принципе читаемо
$context['display_mode'] = $cur_profile['pm_prefs'] & 3;
Берётся переменная $cur_profile['pm_prefs'] которая усекается до двух последних битов (т.к. число три в битовой форме имеет вид 11) и результат присваивается переменной $context['display_mode']. В данном примере тройка представляет из себя так называемую битовую маску, которая определяет какие биты контролировать.

Что касается первого примера - для меня он нечитаем. Приведите более полный кусок кода (пару строк выше и пару строк ниже) - возможно тогда будет понятнее. Скорее всего этот код является составной частью какого-то условия.
Поблагодарили: vdovbnenko, kaktus, Uragan66

Оффлайн kaktus

  • Завхоз, а не админ)
  • *
  • Сообщений: 934

Помогите синтаксис выражения разобрать
« Ответ #2 : 29 Ноябрь 2016, 23:08 »
Вот полный вариант первого выражения)
				// This is, frankly, a joke. We will put in a workaround for people sending to themselves - yawn!
if ($context['folder'] == 'sent' && $row['id_member_from'] == $user_info['id'] && $row['deleted_by_sender'] == 1)
continue;
elseif ($row['id_member'] == $user_info['id'] & $row['deleted'] == 1)
continue;


Цитата
$context['display_mode'] = $cur_profile['pm_prefs'] & 3;
Берётся переменная $cur_profile['pm_prefs'] которая усекается до двух последних битов (т.к. число три в битовой форме имеет вид 11) и результат присваивается переменной $context['display_mode']. В данном примере тройка представляет из себя так называемую битовую маску, которая определяет какие биты контролировать.
$cur_profile['pm_prefs'] может принимать значения 0, 1, 2
в двоичном коде они так выглядят.. 00, 01, 10.
зачем это еще и отсекать до трех битов? типа валидации? почему тогда не отсекли значением 2?

Спасибо)
Поблагодарили: vdovbnenko

Оффлайн kaktus

  • Завхоз, а не админ)
  • *
  • Сообщений: 934

Помогите синтаксис выражения разобрать
« Ответ #3 : 29 Ноябрь 2016, 23:19 »
а тройка у нас получается тогда в двоичном виде 011..

получается что такой вот результат у нас на выходе? ну да.. валидация грубо говоря.. хотя переменная может принять и значение 3..что выходит за пределы валидаци)

000 & 011 = 000
001 & 011 = 001
010 & 011 = 010

011 & 011 = 011




Поблагодарили: vdovbnenko

Оффлайн технарь

  • *
  • Сообщений: 3805
  • Пол: Мужской

Помогите синтаксис выражения разобрать
« Ответ #4 : 29 Ноябрь 2016, 23:37 »
if ($context['folder'] == 'sent' && $row['id_member_from'] == $user_info['id'] && $row['deleted_by_sender'] == 1)
                    continue;
elseif ($row['id_member'] == $user_info['id'] & $row['deleted'] == 1)
                    continue;
Как я и предполагал - это часть условия. И скорее всего тут ошибка - применён побитовый оператор & а по уму тут должен быть логический оператор &&. Но фишка в том, что по сути код будет работать правильно, т.к. побитовый оператор стоит между двух условий, результатом которых формально является "0" или "1" и применение к ним побитового оператора & будет аналогичным применению логического оператора &&. Но я приведу разбор правильного с моей точки зрения кода...
elseif ($row['id_member'] == $user_info['id'] && $row['deleted'] == 1)
Эта строка говорит - "иначе, если переменная $row['id_member'] равна переменной $user_info['id']  И  переменная $row['deleted'] равна единице, то..."

Но вообще говоря весь код ничего не выполняет, т.к. и первая и вторая часть условия делает одно и то же. :??
Поблагодарили: vdovbnenko, kaktus

Оффлайн технарь

  • *
  • Сообщений: 3805
  • Пол: Мужской

Помогите синтаксис выражения разобрать
« Ответ #5 : 29 Ноябрь 2016, 23:44 »
получается что такой вот результат у нас на выходе?
Результат будет в диапазоне от 0 до 3 включительно.

почему тогда не отсекли значением 2?
Если в качестве битовой маски использовать 2  (b10) - в результате никогда не появится число 1 (b01).

Поблагодарили: vdovbnenko, kaktus, Uragan66