Зачем использовать hex?



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



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



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


теперь зачем им использовать 0x80? Я не так хорош с hex, но я нашел онлайн-hex для decimal, и он дал мне 128 для 0x80.



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



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


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



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



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

832   12  

12 ответов:

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

например, В первом случае, 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.
В hex, это яснее: начните с 0x4996:02d2, заканчивается 0x4996:0000.

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

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

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

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

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

Я нахожу это сводящим с ума, что семейство языков 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)

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

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

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

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

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

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

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

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

Я надеюсь, что помогает.

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

OxFF = 1111 1111 ( F = 1111 )

но

255 = 1111 1111 

, потому что

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

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

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

Если быть более точным, шестнадцатеричные и десятичные, все числа. Основание (основание 10, 16 и т. д.) - Это способы представить эти числа таким образом, чтобы они были либо более ясными, либо более удобными.

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

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

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

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

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

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

шестнадцатеричные или шестнадцатеричные числа представляют собой 4 бита данных, от 0 до 15 или в шестнадцатеричном формате от 0 до F. два шестнадцатеричных значения представляют собой байт.

глядя на файл, это какой-то довольно groady код. Надеюсь, вы хорошо разбираетесь в C и не используете его в качестве учебника...

Hex полезен, когда вы непосредственно работаете на уровне бит или чуть выше него. Например, работа над драйвером, где вы смотрите прямо на биты, поступающие с устройства, и скручиваете результаты, чтобы кто-то другой мог прочитать когерентный результат. Это компактное довольно простое для чтения представление двоичного кода.

Comments

    Ничего не найдено.