C - Быстрое преобразование между двоичным и шестнадцатеричным представлениями - PullRequest
4 голосов
/ 14 февраля 2012

Чтение или написание кода на C, у меня часто возникают трудности с переводом чисел из двоичного в шестнадцатеричное представление и обратно.Обычно различные маски, такие как 0xAAAA5555, очень часто используются в низкоуровневом программировании, но трудно распознать особый шаблон битов, которые они представляют.Есть ли какое-нибудь легкое для запоминания правило, как сделать это быстро в уме?

Ответы [ 3 ]

8 голосов
/ 14 февраля 2012

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

A = 10 = 8+2 = 1010 ... 5 = 4 + 1 = 0101

, просто помните о весах 8-4-2-1 .

A        5     
8+4+2+1  8+4+2+1
1 0 1 0  0 1 0 1
3 голосов
/ 14 февраля 2012

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

> 0xA4 

как

> b 1010 0100
>   ---- ---- (4 binary digits for each part)
>     A    4
0 голосов
/ 14 февраля 2012

Преобразование рассчитывается путем деления базового представления 10 на 2 и размещения остатков в обратном порядке.Я делаю это в своей голове, кажется, работает.

Итак, вы говорите, как выглядит 0xAAAA5555

Я просто выясняю, как выглядит A, а 5 - как

A = 10

10 / 2 = 5 r 0 
 5 / 2 = 2 r 1
 2 / 2 = 1 r 0
 1 / 2 = 0 r 1

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

Вы можете связать блоки по 4 бита вместе, так что AA равно 10101010. Чтобы преобразовать двоичный код обратно в гекс, я всегда снова перебираю основание 10, суммируя степени 2. Вы можете сделать это, сформировав блоки из 4 бит (заполнение нулями) и выстроив результаты.

поэтому 111011101 равно 0001 1101 1101, что (1) (1 + 4 + 8) (1 + 4 + 8) = 1 13 13, что 1DD

...