2017-01-16 10 views
0

Я работаю над проблемой из трещин Интервью с кодированием, в котором требуется, чтобы я менял нечетные и четные биты в целое число с минимальными инструкциями (например, бит 0 и 1 заменяются, биты 2 и 3 меняются местами и т. д.)Битмаскирование - когда использовать hex vs binary

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

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

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

ответ

1

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

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

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

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

Таким образом, вы можете использовать маску в любой базе без проблем? – Sunny

+1

Да; это то же * значение *, независимо от используемой базы. Это всего лишь разные способы написания «двух миллиардов, восемьсот шестьдесят три миллиона триста одиннадцать тысяч пятьсот тридцать». Двоичные и шестнадцатеричные просто помогают сделать это более очевидным * почему * это конкретное значение используется. – chepner