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, C; Три бита: 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

Просто определям как изглежда А и 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