C - Быстрое преобразование между двоичными и шестнадцатеричными представлениями

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


person psihodelia    schedule 14.02.2012    source источник
comment
кроме 0 и F, которые просты, вы должны знать биты. руда использовать windows calc :)   -  person vulkanino    schedule 14.02.2012
comment
Эти низкоуровневые константы будут очень контекстно-зависимыми, поэтому единственный возможный подход — развивать свой опыт в этом контексте.   -  person Useless    schedule 14.02.2012
comment
Напишите таблицу конверсии на стикере и приклейте его к краю монитора. 0=0000, 1=0001, 2=0010, 3=0011, 4=0100, ..., F=1111. К тому времени, когда клей отклеится, вы, вероятно, запомните их или перейдете к другому проекту. «Цифры», наиболее часто используемые для маскирования, — это те, которые состоят либо из одного бита, либо из группы смежных битов. Однобитные: 1, 2, 4, 8; Два бита: 3, 6, С; Три бита: 7, E; Четыре: F. О тех, о которых мне все еще иногда приходится думать, есть промежутки между битами: 5, 9, A, B, D.   -  person Brian McFarland    schedule 14.02.2012


Ответы (3)


Каждая шестнадцатеричная цифра отображается точно на 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
person Felice Pollano    schedule 14.02.2012

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

> 0xA4 

As

> b 1010 0100
>   ---- ---- (4 binary digits for each part)
>     A    4
person Pablo Santa Cruz    schedule 14.02.2012
comment
это легко, но как насчет обратного отображения? - person psihodelia; 14.02.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

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

Вы можете связать блоки из 4 битов вместе, поэтому A A равно 1010 1010. Чтобы преобразовать двоичное число обратно в шестнадцатеричное, я всегда снова прохожу по основанию 10, суммируя степени 2. Вы можете сделать это, формируя блоки из 4 бит (дополняя с помощью 0s) и запишите результаты.

так что 111011101 это 0001 1101 1101 что это (1) (1 + 4 + 8) (1 + 4 + 8) = 1 13 13 что это 1DD

person Matt Esch    schedule 14.02.2012