Битовая маска — когда использовать шестнадцатеричный код против двоичного

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

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

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

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


person segue_segway    schedule 16.01.2017    source источник


Ответы (1)


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

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

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

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