Если бы вы собирались хранить дату в виде числа, возможно, вы бы сделали это, умножив год на 10000, месяц на 100 и прибавив день. Такая дата, как 2 июля 2011 года, будет закодирована как число 20110702:
year * 10000 + month * 100 + day -> yyyymmdd
2011 * 10000 + 7 * 100 + 2 -> 20110702
Можно сказать, что мы закодировали дату в маске ггггммдд. Мы могли бы описать эту операцию как
- Сдвиньте год на 4 позиции влево,
- сдвиньте месяц на 2 позиции влево и
- оставить день как есть.
- Затем объедините три значения вместе.
Это то же самое, что происходит с кодированием возраста, пола и роста, только автор мыслит бинарно.
См. диапазоны, которые могут иметь эти значения:
age: 0 to 127 years
gender: M or F
height: 0 to 127 inches
Если мы переведем эти значения в двоичный формат, мы получим следующее:
age: 0 to 1111111b (7 binary digits, or bits)
gender: 0 or 1 (1 bit)
height: 0 to 1111111b (7 bits also)
Имея это в виду, мы можем закодировать данные возраста, пола и роста маской aaaaaaaaghhhhhhh, только здесь мы говорим о двоичных цифрах, а не десятичных< /em> цифры.
So,
- Сдвиньте возраст на 8 битов влево,
- сдвиньте пол на 7 битов влево и
- оставить высоту как есть.
- Затем объедините все три значения вместе.
В двоичном формате оператор Shift-Left (‹‹) перемещает значение на n позиций влево. Оператор «ИЛИ» («|» во многих языках) объединяет значения вместе. Следовательно:
(age << 8) | (gender << 7) | height
Теперь, как «расшифровать» эти значения?
В двоичном виде проще, чем в десятичном:
- Ты «маскируешь» высоту,
- сдвиньте пол на 7 бит вправо и также замаскируйте это, и, наконец,
- сдвиньте возраст 8 бит вправо.
Оператор Shift-Right (>>) перемещает значение на n позиций вправо (любые цифры, сдвинутые «вне» из крайнего правого положения, теряются). Бинарный оператор «И» («&» во многих языках) маскирует биты. Для этого ему нужна маска, указывающая, какие биты сохранить, а какие уничтожить (1 бит сохраняется). Следовательно:
height = value & 1111111b (preserve the 7 rightmost bits)
gender = (value >> 1) & 1 (preserve just one bit)
age = (value >> 8)
Поскольку 1111111b в шестнадцатеричном формате на большинстве языков равно 0x7f, это и есть причина этого магического числа. Вы получите тот же эффект, используя 127 (что равно 1111111b в десятичном формате).
person
Branco Medeiros
schedule
02.07.2011