Побитовые операторы

Тренажер по PHP для пользователей с начальным уровнем подготовки.

Тренажер PHP

Этот тренажер посвящен побитовым операторам в PHP. На первый взгляд они могут показаться сложными и редко используемыми, но на самом деле это мощный инструмент для работы с правами доступа, флагами состояний и оптимизации некоторых вычислений. Мы начнем с основ — разберемся, что означает каждый оператор, а затем перейдем к практическим задачам. Ты научишься "читать" и "писать" данные на самом низком уровне — уровне битов. Задания построены так, чтобы постепенно погрузить тебя в тему: от простого сопоставления операторов до решения задач с битовыми флагами.

Список тем

Сопоставьте оператор и его название

id: 38932_task_compare_1

Для начала давайте разберемся в базовой терминологии. Перед вами четыре основных побитовых оператора и их названия. Ваша задача — правильно сопоставить символ оператора с его полным названием, перетащив элементы из правой колонки.

Сопоставьте строки в правой части с соответствующими строками в левой по порядковому номеру
Побитовое "И" (AND)
Побитовое "ИЛИ" (OR)
Исключающее "ИЛИ" (XOR)
Побитовое "НЕ" (NOT)
| (Вертикальная черта)
^ (Карет)
~ (Тильда)
& (Амперсанд)
Сообщения
Проверить
Показать подсказку

Результат операции "И" (AND)

id: 38932_task_give_result_1

Оператор `&` (Побитовое "И") сравнивает биты двух чисел. Если оба бита на одной и той же позиции равны 1, то результирующий бит тоже будет 1. В противном случае — 0. Предскажите, что выведет данный код.

Что должно получиться?
echo 5 & 3;
Сообщения
Проверить
Показать подсказку

Результат операции "ИЛИ" (OR)

id: 38932_task_predict_result_2

Оператор `|` (Побитовое "ИЛИ") также сравнивает биты. Если хотя бы один из битов на одной и той же позиции равен 1, то результирующий бит будет 1. Иначе — 0. Выберите правильный результат выполнения кода.

Выберите правильный вариант ответа
echo 6 | 3;
Сообщения
Проверить
Показать подсказку

Результат операции "Исключающее ИЛИ" (XOR)

id: 38932_task_give_result_3

Оператор `^` (Исключающее "ИЛИ") возвращает 1, если биты на одной позиции различаются, и 0, если они одинаковы. Это полезно для переключения флагов. Укажите, что выведет этот код.

Что должно получиться?
echo 10 ^ 12;
Сообщения
Проверить
Показать подсказку

Проверка флага доступа

id: 38932_task_replace_4

Побитовые операторы часто используются для управления правами доступа. У нас есть переменная `$permissions`, хранящая набор прав пользователя, и константа `PERM_WRITE`, представляющая право на запись. Вставьте правильный оператор, чтобы проверить, есть ли у пользователя это право.

Заполните пропуски
define('PERM_READ', 1);    // 001
define('PERM_WRITE', 2);   // 010
define('PERM_EXECUTE', 4); // 100

// У пользователя есть права на чтение и выполнение
$permissions = 5; // 101

// Проверяем право на запись
if ($permissions input1S PERM_WRITE) {
    echo "Доступ на запись разрешен";
} else {
    echo "Доступ на запись запрещен";
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Исправьте ошибку в проверке прав

id: 38932_task_error_5

В этом коде допущена частая ошибка новичков. Вместо побитового оператора для проверки флага используется логический. Из-за этого проверка работает некорректно. Найдите и исправьте ошибку в строке с условием `if`.

Найдите ошибку и исправьте
define('CAN_DELETE', 8); // 1000
 
$user_permissions = 10; // 1010 (права на запись и удаление)
 
// Проверяем, есть ли право на удаление
if ($user_permissions && CAN_DELETE) {
    echo "Пользователь может удалять.";
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Сдвиг влево

id: 38932_task_predict_result_6

Оператор сдвига влево `<<` сдвигает все биты числа на указанное количество позиций влево, заполняя освободившиеся справа места нулями. Это быстрый способ умножения на степень двойки. Что выведет код?

Выберите правильный вариант ответа
echo 5 << 2;
Сообщения
Проверить
Показать подсказку

Сдвиг вправо

id: 38932_task_give_result_7

Оператор сдвига вправо `>>` работает наоборот: сдвигает биты вправо. "Выпадающие" справа биты отбрасываются. Это эквивалентно целочисленному делению на степень двойки. Какой будет результат?

Что должно получиться?
echo 20 >> 1;
Сообщения
Проверить
Показать подсказку

Установка и снятие флага

id: 38932_task_bank_fill_8

Теперь объединим знания. Ваша задача — добавить флаг `FLAG_B` к переменной `$flags`, а затем снять его. Используйте операторы из банка, чтобы правильно выполнить обе операции. Перетащите нужные операторы в пропуски.

Нужно правильно расставить в пропуски предложенные варианты
const FLAG_A = 1; // 001
const FLAG_B = 2; // 010
const FLAG_C = 4; // 100

$flags = FLAG_A | FLAG_C; // Изначально 5 (101)

// 1. Добавляем FLAG_B
$flags = $flags input1S FLAG_B;

// 2. Снимаем FLAG_B, оставляя остальные
$flags = $flags input2S (input3S FLAG_B);

echo $flags;
|
&
~
^
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку
НайтиКурс.Ру