Зачем использовать шестигранник?

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

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

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

Зачем им использовать 9X_cxx 0x80? Я не так хорошо разбираюсь в шестнадцатеричном 9X_c формате, но я нашел онлайн-шестнадцатеричный 9X_cxx для десятичного, и он дал мне 128 для 0x80.

Также 9X_hex перед строкой 134, в строке 114 у них есть 9X_cpp следующее:

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

Преобразование шестнадцатеричного 9X_hex числа в десятичное дало мне 4294901760 для 9X_hex этого шестнадцатеричного числа. Итак, здесь, в 9X_hexadecimal этой строке, они выполняют небольшое И и 9X_hexadecimal-notation сравнивают результат с 0 ??

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

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

62
0
12
Общее количество ответов: 12

Ответ #1

Ответ на вопрос: Зачем использовать шестигранник?

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

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

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

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

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

Во втором примере целью было удалить два 9X_c++ младших байта значения. Итак, учитывая значение 9X_hex 1 234 567 890, мы хотим получить 1 234 567 9X_hex 168.
В шестнадцатеричном формате все яснее: начинайте 9X_cxx с 0x4996:02d2, заканчивая 0x4996:0000.

106
2

  • D'Oh! Знаешь, я спорил между написанием «4 цифры» и «два байта ...

Ответ #2

Ответ на вопрос: Зачем использовать шестигранник?

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

Как 9X_c++ пережиток моих 8-битных дней, я считаю шестнадцатеричный 9X_hex формат удобным сокращением для всего двоичного. Битовый 9X_cpp твиддл - это умирающий навык. Однажды (около 9X_c 10 лет назад) я увидел в университете работу 9X_c по сетевому взаимодействию на третьем курсе, где 9X_c++ только 10% (5 из 50 или около того) людей 9X_hexadecimal-notation в классе могли вычислить битовую маску.

19
0

Ответ #3

Ответ на вопрос: Зачем использовать шестигранник?

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

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

18
0

Ответ #4

Ответ на вопрос: Зачем использовать шестигранник?

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

16
0

Ответ #5

Ответ на вопрос: Зачем использовать шестигранник?

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

int mask = 0b00001111;

Много лет назад, работая над проектом, который 9X_cpp включал в себя огромное количество вычислений 9X_hex на уровне битов, мне это надоело, и я сгенерировал 9X_cpp файл заголовка, который содержал определенные 9X_hexadecimal константы для всех возможных двоичных значений 9X_hexadecimal-notation до 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)

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

10
2

  • Re: «Я давно хотел, чтобы они добавили прямую поддержку двоично ...

Ответ #6

Ответ на вопрос: Зачем использовать шестигранник?

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

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

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

Через некоторое время они 9X_hex перейдут к:

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

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

#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...

7
0

Ответ #7

Ответ на вопрос: Зачем использовать шестигранник?

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

Иногда это может быть связано с объемом 9X_cxx пространства, который может предложить конкретный 9X_c++ тип значения, поэтому это также может иметь 9X_cxx значение.

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

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

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

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

Кроме 9X_cxx того, некоторым людям очень комфортно пользоваться 9X_cpp шестигранником. Также обратите внимание, что 9X_hexadecimal жестко запрограммированные магические числа 9X_cpp - это всего лишь то, что не так важно, независимо 9X_hexadecimal-notation от используемой системы нумерации

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

6
0

Ответ #8

Ответ на вопрос: Зачем использовать шестигранник?

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

OxFF = 1111 1111 ( F = 1111 )

но

255 = 1111 1111 

потому 9X_hexadecimal что

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

Вы это видите? Намного проще перейти 9X_hexadecimal от шестнадцатеричного к двоичному.

6
0

Ответ #9

Ответ на вопрос: Зачем использовать шестигранник?

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

4
0

Ответ #10

Ответ на вопрос: Зачем использовать шестигранник?

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

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

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

4
0

Ответ #11

Ответ на вопрос: Зачем использовать шестигранник?

Точнее, шестнадцатеричные и десятичные числа 9X_cpp - это ЧИСЛА. Система счисления (основание 9X_c++ 10, 16 и т. Д.) Позволяет представить эти 9X_hexadecimal-notation числа более понятным или более удобным способом.

При 9X_cxx обсуждении того, «сколько всего чего-то 9X_hexadecimal есть», мы обычно используем десятичные числа. Когда 9X_cpp мы смотрим на адреса или битовые комбинации 9X_cpp на компьютерах, обычно предпочтительнее 9X_hex шестнадцатеричное число, потому что часто 9X_c значение отдельных байтов может быть важным.

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

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

3
0

Ответ #12

Ответ на вопрос: Зачем использовать шестигранник?

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

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

2
1

  • В этом коде нет ничего плохого. Глядя на этот ко ...