Вопрос

Эй!Я просматривал этот код на 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??

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

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

Это было полезно?

Решение

В обоих приведенных вами случаях важен битовый шаблон числа, а не само число.

Например, В первом случае, 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.

Другие советы

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

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

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

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

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

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

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

OxFF = 1111 1111 ( F = 1111 )

но

255 = 1111 1111 

потому что

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

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

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

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

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

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

Чтобы быть более точным, шестнадцатеричное и десятичное - это все ЧИСЛА.Основание (10, 16 и т.д.) - это способы представления этих чисел либо более понятным, либо более удобным способом.

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top