Зачем использовать гекс? - PullRequest
57 голосов
/ 28 октября 2008

Эй! Я искал этот код на http://www.gnu.org/software/m68hc11/examples/primes_8c-source.html

Я заметил, что в некоторых ситуациях они использовали шестнадцатеричные числа, как в строке 134:

for (j = 1; val && j <= 0x80; j <<= 1, q++)

Теперь, почему они используют 0x80? Я не очень хорош с гексом, но я нашел гекс онлайн с десятичной дробью, и он дал мне 128 за 0x80.

Также перед строкой 134, в строке 114 они имеют это:

small_n = (n & 0xffff0000) == 0;

От шестнадцатеричного числа к десятичному я получил за это шестнадцатеричное число 4294901760. Итак, здесь, в этой строке они делают немного И и сравнивают результат с 0 ??

Почему бы просто не использовать номер? Может кто-нибудь объяснить, пожалуйста, и приведите примеры других ситуаций.

Также я видел большие строки кода, где это просто шестнадцатеричные числа, и никогда не понимал почему: (

Ответы [ 12 ]

105 голосов
/ 28 октября 2008

В обоих случаях, которые вы цитируете, важна битовая комбинация числа, а не фактическое число.

Например, В первом случае j будет 1, затем 2, 4, 8, 16, 32, 64 и, наконец, 128 по мере прохождения цикла.

В двоичном виде, то есть

0000:0001, 0000:0010, 0000:0100, 0000:1000, 0001:0000, 0010:0000, 0100:0000 и 1000:0000.

Нет опции для двоичных констант в C или C ++, но это немного понятнее в Hex: 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40 и 0x80.

Во втором примере цель состояла в том, чтобы удалить два младших байта значения. Таким образом, учитывая значение 1,234,567,890, мы хотим получить 1,234,567,168.
В шестнадцатеричном виде это понятнее: начинайте с 0x4996:02d2, заканчивайте 0x4996:0000.

18 голосов
/ 28 октября 2008

Существует прямое отображение между шестнадцатеричными (или восьмеричными) цифрами и базовыми битовыми комбинациями, что не относится к десятичной системе счисления. Десятичное число «9» представляет что-то другое в отношении битовых комбинаций в зависимости от того, в каком столбце он находится и какие числа его окружают - оно не имеет прямого отношения к битовой комбинации. В гексах «9» всегда означает «1001», независимо от того, какой столбец. 9 = «1001», 95 = «*1001* 0101» и так далее.

В качестве остатка моих 8-битных дней я нахожу гекс удобным сокращением для чего-либо двоичного. Бит тиддлинг - умирающий навык. Однажды (около 10 лет назад) в университете я видел сетевой документ на третьем курсе, где только 10% (5 из 50 или около того) людей в классе могли вычислить битовую маску.

18 голосов
/ 28 октября 2008

это немного маска. Шестнадцатеричные значения позволяют легко увидеть базовое двоичное представление. n & 0xffff0000 возвращает 16 старших бит n. 0xffff0000 означает «16 1 с и 16 0 в двоичном формате»

0x80 означает «1000000», поэтому вы начинаете с «00000001» и продолжаете сдвигать этот бит влево «0000010», «0000100» и т. Д. До «1000000»

16 голосов
/ 28 октября 2008

0xffff0000 легко понять, что это 16 раз «1» и 16 раз «0» в 32-битном значении, тогда как 4294901760 - волшебство.

10 голосов
/ 28 октября 2008

Меня сводит с ума то, что семейство языков C всегда поддерживает восьмеричные и шестнадцатеричные, но не двоичные. Я давно хотел, чтобы они добавили прямую поддержку двоичного файла:

int mask = 0b00001111;

Много лет назад, работая над проектом, в котором использовалось огромное количество математических данных на уровне битов, я сыт по горло и сгенерировал заголовочный файл, который содержал определенные константы для всех возможных двоичных значений до 8 бит: *

#define b0        (0x00)
#define b1        (0x01)
#define b00       (0x00)
#define b01       (0x01)
#define b10       (0x02)
#define b11       (0x03)
#define b000      (0x00)
#define b001      (0x01)
...
#define b11111110 (0xFE)
#define b11111111 (0xFF)

Иногда он делает определенный битовый код более читабельным.

6 голосов
/ 28 октября 2008

Самое большое использование шестнадцатеричного кода, вероятно, во встроенном программировании. Шестнадцатеричные числа используются для маскировки отдельных битов в аппаратных регистрах или для разделения нескольких числовых значений, упакованных в один 8, 16 или 32-битный регистр.

При указании отдельных битовых масок многие люди начинают с:

#define bit_0 1
#define bit_1 2
#define bit_2 4
#define bit_3 8
#define bit_4 16
etc...

Через некоторое время они переходят к:

#define bit_0 0x01
#define bit_1 0x02
#define bit_2 0x04
#define bit_3 0x08
#define bit_4 0x10
etc...

Затем они учатся обманывать и позволяют компилятору генерировать значения как часть оптимизации времени компиляции:

#define bit_0 (1<<0)
#define bit_1 (1<<1)
#define bit_2 (1<<2)
#define bit_3 (1<<3)
#define bit_4 (1<<4)
etc...
6 голосов
/ 28 октября 2008

Обычно использование шестнадцатеричных чисел вместо десятичных - это потому, что компьютер работает с битами (двоичными числами), и когда вы работаете с битами, также более понятно использовать шестнадцатеричные числа, потому что легче перейти от шестнадцатеричных к двоичным, чем из Десятичное в двоичное.

OxFF = 1111 1111 ( F = 1111 )

но

255 = 1111 1111 

потому что

255 / 2 = 127 (rest 1)
127 / 2 = 63 (rest 1)
63 / 2 = 31 (rest 1)
... etc

Ты видишь это? Гораздо проще перейти от шестнадцатеричного кода к двоичному.

6 голосов
/ 28 октября 2008

Иногда визуальное представление значений в HEX делает код более читабельным или понятным. Например, маскирование битов или использование битов становится неочевидным при рассмотрении десятичных представлений чисел.

Иногда это может быть связано с количеством места, которое может предложить определенный тип значения, так что это также может сыграть свою роль.

Типичный пример может быть в двоичном параметре, поэтому вместо десятичного отображения некоторых значений мы используем двоичный.

скажем, у объекта был неисключительный набор свойств, у которых были значения либо вкл, либо выкл (3 из них) - один из способов представления состояния этих свойств - 3 бита.

допустимые представления - от 0 до 7 в десятичном виде, но это не так очевидно. более очевидным является двоичное представление:

000, 001, 010, 011, 100, 101, 110, 111

Кроме того, некоторым людям просто очень удобно с гексом. Также обратите внимание, что жестко запрограммированные магические числа являются именно этим, и это не так важно, независимо от того, какую систему нумерации использовать

Надеюсь, это поможет.

4 голосов
/ 30 октября 2008

В байте 8 бит. Hex, основание 16, лаконично. Любое возможное значение байта выражается с использованием двух символов из коллекции 0..9 плюс a, b, c, d, e, f.

База 256 будет более краткой. Каждый возможный байт может иметь свой собственный отдельный символ, но большинство человеческих языков не используют 256 символов, поэтому Hex - победитель.

Чтобы понять важность краткости, учтите, что еще в 1970-х годах, когда вы хотели проверить свой мегабайт памяти, он был распечатан в шестнадцатеричном формате. Распечатка будет использовать несколько тысяч страниц большой бумаги. Октал бы потратил еще больше деревьев.

3 голосов
/ 28 октября 2008

Чтобы быть более точным, шестнадцатеричный и десятичный, все это НОМЕРА. Основа (основание 10, 16 и т. Д.) - это способы представления этих чисел более понятным или удобным способом.

При обсуждении "сколько-то еще" мы обычно используем десятичное число. Когда мы смотрим на адреса или битовые шаблоны на компьютерах, обычно предпочтительнее hex, потому что часто значение отдельных байтов может быть важным.

Шестнадцатеричное (и восьмеричное) обладает свойством того, что они являются степенями двойки, поэтому они красиво отображают группы битов. Шестнадцатеричный код отображает 4 бита в один шестнадцатеричный полубайт (0-F), поэтому байт сохраняется в двух полубайтах (00-FF). Octal был популярен на цифровом оборудовании (DEC) и других старых машинах, но одна восьмеричная цифра соответствует трем битам, поэтому она не так хорошо пересекает границы байтов.

В целом, выбор radix - это способ упростить ваше программирование - используйте тот, который наилучшим образом соответствует области.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...