[왕초보 임베디드-C 공부 일기] 10. 2진수와 16진수
I. 2진수(Binary): 기계의 언어
1. 정의와 원리
2진수는 0과 1, 단 두개의 숫자만을 사용하여 모든 데이터를 표현하는 수 체계이다.
- 원리 : CPU와 메모리는 수십억개의 미세한 스위치(트랜지스터)로 이루어져 있다. 이 스위치에 전기가 흐르면 1(High), 흐르지 않으면 0(Low)으로 인식된다. 즉, 2진수는 하드웨어의 물리적 상태를 직관적으로 알려주는 수학적 도구이다.
- 자릿수 : 각 자리는 2의 거듭제곱의 크기를 가진다.
2. 구체적인 활용 사례 : 상태 제어(Bit Level Control)
임베디드 시스템에서 2진수는 하드웨어 핀(Pin)의 켜고 꺼짐을 직접적으로 통제할 때 사용된다.
임베디드 시스템에서 2진수는 하드웨어 핀(Pin)의 켜고 꺼짐을 직접적으로 통제할 때 사용된다.
- 상황 : 각 센서의 상태를 1바이트(8비트) 변수 하나에 담아서 읽어온다.
만약 변수 값이 '0b10000001'이라면, (0b는 C언어에서 2진수를 나타내는 접두사를 의미한다.)
가장 왼쪽 비트가 1 -> 8번 센서 켜짐
가장 오른쪽 비트가 1 -> 1번 센서 켜짐
중간의 0들 -> 2~7번 센서는 꺼짐
이처럼 2진수는 데이터를 숫자(크기)로 보는 것이 아니라, 독립적인 8개의 스위치 상태로 직관적으로 바라볼 수 있게 해준다.
II. 16진수(Hexadecimal) : 엔지니어의 언어
1. 정의와 원리
16진수는 0부터 9까지의 숫자에 더해 A부터 F까지의 알파벳(10~15를 의미)을 더해, 총 16개의 기호로 수를 표현하는 체계이다. C언어에서는 숫자 앞에 0x를 붙여서 표현한다. (예 : 0x2A)
- 왜 하필 16진수인가? : 기계는 2진수를 좋아하지만, 사람은 끝도 없이 나열된 0과 1을 읽다가눈이 빠지고 오타를 낸다. 이때 2^4=16이라는 수학적 장치를 도입한다.
- 원리(4비트 압축) : 2진수 딱 4자리가 모이면 표현할 수 있는 경우의 수는 16가지이다.
즉, 2진수 4자리를 정확히 16진수 1자리로 1:1 치환할 수 있다. - 예시 : 2진수 1100 1010 1111 0101 (16비트)
1100 -> C, 1010-> A, 1111-> F, 0101-> 5
2진수 0b1100101011110101 = 16진수 0xCAF5
2. 구체적인 활용 사례 : 메모리 주소와 레지스터 세팅
32비트 마이크로컨트롤러(MCU)를 다룰 때, 16진수는 절대적인 기준이 된다.
- 사례 A: 메모리 맵 주소 지정
임베디드 C 프로그래밍에서 특정 하드웨어를 조종하려면 그 부품이 연결된 '메모리 주소'를 알아야 한다.
32비트 주소 체계에서는 주소가 총 32개의 0과 1로 이루어진다.- 2진수 표기 : 0b01000000000000100001000000000000 (사용 불가 수준)
- 16진수 표기 : 0x40021000
엔지니어는 데이터 시트에 적힌 이 간결한 16진수 주소를 포인터로 연결하여 하드웨어를 제어한다.
- 사례 B: 비트 마스킹 조작
비트 마스킹이란, 특정 위치의 비트들만 선택적으로 읽거나, 쓰거나, 지우거나, 유지하기 위해 사용하는 비트 연산 기법이다. 특정 비트를 켜고 끄고 싶을 때 16진수와 비트 연산자( & , | )를 조합한다.- 상황 : 32개의 핀을 제어하는 레지스터에서, 딱 12번 핀과 13번 핀만 1(ON)로 만들고 싶다고 가정한다.
- 12번, 13번 비트인 1인 2진수는 00000000000000000011000000000000 이다.
- 이를 4자리씩 끊어서 16진수로 바꾸면 0x00003000 이 된다.
- 상황 : 32개의 핀을 제어하는 레지스터에서, 딱 12번 핀과 13번 핀만 1(ON)로 만들고 싶다고 가정한다.
// 기존 상태를 유지하면서 12, 13번 핀만 켠다 (OR 연산은 | 사용) GPIO_PORT_REGISTER = GPIO_PORT_REGISTER | 0x00003000;
⬛ 요약
- 2진수는 전류의 흐름(ON/OFF)을 직관적으로 설정하는 물리적 최소 단위이다.
- 16진수는 길고 복잡한 2진수 4개를 단 1개의 문자로 압축해 주는 가독성 최적화 도구이다.
- 임베디드 코드를 작성할 때, 하드웨어 주소록(데이터 시트)은 모두 16진수로 되어 있으며, 비트를 쪼개서 제어할 때는 16진수 마스크(0x0F, 0xFF)를 빈번하게 사용하게 된다.