При чтении или написании кода на C у меня часто возникают трудности с переводом чисел из двоичного в шестнадцатеричное представление и обратно. Обычно различные маски, такие как 0xAAAA5555
, очень часто используются в низкоуровневом программировании, но трудно распознать особый набор битов, которые они представляют. Есть какое-нибудь легко запоминающееся правило, как делать это быстро в уме?
C - Быстрое преобразование между двоичными и шестнадцатеричными представлениями
Ответы (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
Мне всегда легко сопоставить HEX с BINARY числами. Поскольку каждая шестнадцатеричная цифра может быть напрямую сопоставлена с четырехзначным двоичным числом, вы можете представить себе следующее:
> 0xA4
As
> b 1010 0100
> ---- ---- (4 binary digits for each part)
> A 4
Преобразование вычисляется путем деления представления с основанием 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