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, так как... ну, может и нет. Вы можете видеть, что что- то чередуется, но если вы не используете восьмеричное много, не ясно, что это за чередующийся шаблон в двоичном коде.