Bitmasking- когда использовать hex против двоичного

Я работаю над проблемой взлома Интервью по кодированию, которая требует, чтобы я поменял местами нечетные и четные биты с как можно меньшим количеством инструкций (например, биты 0 и 1 поменялись местами, биты 2 и 3 поменялись местами и т. Д.)

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

Я понимаю ее решение, но я не понимаю, как она схватила четные / нечетные биты. Она создает две битовые маски - как в шестнадцатеричном - для 32-битного целого числа. Два: 0xaaaaaaaa и 0x55555555. Я понимаю, что она, по сути, создает эквивалент 1010101010... для 32-разрядного целого числа в шестнадцатеричном формате, а затем выполняет AND с исходным значением num, чтобы получить четные / нечетные биты соответственно.

Что я не понимаю, так почему она использовала hex? Почему бы просто не код в 10101010101010101010101010101010? Она использовала гекс, чтобы уменьшить многословие? И когда вы должны использовать один над другим?

1 ответ

Решение

Это чтобы уменьшить многословие. Двоичные 10101010101010101010101010101010, шестнадцатеричный 0xaaaaaaaaa и десятичный 2863311530 представляют абсолютно одинаковое значение; они просто используют разные базы для этого. Единственная причина для использования того или иного - воспринимаемая читаемость.

  • Большинство людей явно не хотели бы использовать десятичную здесь; это выглядит как произвольное значение.

  • Двоичный файл ясен: чередование 1 и 0, но с таким большим количеством не очевидно, что это 32-битное значение или что нет соседней пары 1 или 0, скрывающейся где-то посередине.

  • Шестнадцатеричная версия использует преимущества чанкинга. Предполагая, что вы признаете, что 0x0a == 0b1010 Вы можете мысленно изобразить 8 групп из 1010 в предполагаемом значении.
  • Другая возможность была бы восьмеричной 25252525252, так как... ну, может и нет. Вы можете видеть, что что- то чередуется, но если вы не используете восьмеричное много, не ясно, что это за чередующийся шаблон в двоичном коде.
Другие вопросы по тегам