Mediumshift

Чем arithmetic shift отличается от logical shift?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

Logical shift (для unsigned) всегда заполняет нулями. Arithmetic shift (для signed >>) копирует знаковый бит, сохраняя знак.

int x = -8;
x >> 1;            // -4 (arithmetic — копируется знаковый бит)

unsigned y = 0xFFFFFFFC;
y >> 1;            // 0x7FFFFFFE (logical — заполнение нулём)

Для unsigned поведение определено однозначно. Для signed << — UB до C++20 при выходе за диапазон; >> — implementation-defined (на современных платформах всегда arithmetic). С C++20 signed гарантированно two's complement. Совет: для битовых операций — unsigned.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.