안녕하세요! 오늘은 코딩이나 자격증 공부를 하다 보면 한 번쯤 우리를 괴롭히는 진법 변환에 대해 알아보려고 합니다. 10진수밖에 모르는 우리와 0, 1밖에 모르는 컴퓨터 사이의 통역사 역할을 해줄 이 기술, 생각보다 간단합니다!
1. n진수 → 10진수: “자리수 파워를 믿으세요”
어떤 진수든 10진수로 바꿀 때는 각 자리의 숫자에 해당 진수의 거듭제곱을 곱해서 더하면 됩니다.
- 핵심: 오른쪽 끝(0번째 자리)부터 시작해서 왼쪽으로 갈수록 지수가 커집니다.
- 예시: 2진수 $1011_2$을 10진수로 바꾸기

Tip: 모든 수의 0제곱($n^0$)은 1이라는 사실만 기억해도 절반은 성공입니다!
2. 10진수 → n진수: “나머지만 모아라”
10진수를 다른 진수로 바꿀 때는 목표로 하는 진수로 계속 나누면 됩니다.
- 10진수를 바꾸려는 진수(2, 8, 16 등)로 나눕니다.
- 나머지를 오른쪽에 적어둡니다.
- 몫이 0이 될 때까지 반복합니다.
- 가장 마지막에 나온 나머지부터 거꾸로 읽어 올라가면 끝!
- 예시: 10진수 25를 2진수로 바꾸기
- 25 ÷ 2 = 12 … 나머지 1 (↑ 읽기 시작)
- 12 ÷ 2 = 6 … 나머지 0
- 6 ÷ 2 = 3 … 나머지 0
- 3 ÷ 2 = 1 … 나머지 1
- 1 ÷ 2 = 0 … 나머지 1
- 결과: 11001
3. 2진수 ↔ 8진수/16진수: “끼리끼리 묶기”
여기가 가장 꿀팁인 부분입니다! 8은 $2^3$이고, 16은 $2^4$이죠? 그래서 굳이 10진수를 거칠 필요가 없습니다.
- 2진수 → 8진수: 뒤에서부터 3자리씩 끊어서 계산
- 2진수 → 16진수: 뒤에서부터 4자리씩 끊어서 계산
| 진수 (4자리) | 16진수 | 2진수 (4자리) | 16진수 |
| 1010 | A (10) | 1101 | D (13) |
| 1011 | B (11) | 1110 | E (14) |
| 1100 | C (12) | 1111 | F (15) |
델파이 진법변환 소스
2진수 : 0, 1 → 수의 개수가 두 개이기에 2진수.. (4진수 : 0, 1, 2, 3 → 수의 개수가 네 개이기에 4진수..)
8진수 : 0, 1, 2, 3, 4, 5, 6, 7 → 수의 개수가 여덟 개이기에 8진수..
10진수 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 → 수의 개수가 열 개 이기에 10진수..
16진수 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A(10), B(11), C(12), D(13), E(14), F(15) → 수의 개수가 열여섯 개이기에 16진수..
16->10, 10->2, 2->16. 10->8, 2->8
// 문자를 10진수로...
function CharToInteger(chr: Char): Integer;
begin
Result := Ord(chr);
end;
// 16진수를 10진수로...
function HexToInteger(HEX: String): Integer;
begin
if HEX = '' then begin
Result := 0;
end
else begin
HEX := '$' + HEX;
Result := StrToInt(HEX);
end;
end;
// 10진수를 2진수로...
function DecToBinStr(n: integer): String;
var
S: string;
i: integer;
Negative: boolean;
begin
if n = 0 then begin
Result := '0';
System.Exit;
end;
Negative := False;
if n < 0 then
Negative := True; // 음수표시
n := Abs(n);
for i := 1 to SizeOf(n) * 8 do begin
if n < 0 then
S := S + '1'
else
S := S + '0';
n := n shl 1;
end;
Delete(S,1,Pos('1',S) - 1);
//remove leading zeros
if Negative then
S := '-' + S;
Result := S;
end;
// 2진수를 16진수로...
function BinToHex(const Bin: String; const Digits: Integer): String;
var
i,l: Integer;
Res: Extended;
begin
Res := 0;
l := Length(Bin);
for i := l downto 1 do begin
if Bin[i] = '1' then
Res := Res + Power(2,l-i);
end;
Result := IntToHex(Trunc(Res), Digits);
end;
// 10진수를 8진수로...
function DecToOct(iValue: LongInt): String;
var
iRest: LongInt;
sOct: String;
iFor: Integer;
begin
sOct := '';
while iValue > 0 do begin
iRest := iValue mod 8;
iValue := iValue div 8;
sOct := IntToStr(iRest) + sOct;
end;
Result := sOct;
end;
// 2진수를 8진수로...
function BinToOct(const Bin: String): String;
var
i,l: Integer;
Res: Extended;
begin
// 2진수를 10진수로 변환한다
Res := 0;
l := Length(Bin);
for i := l downto 1 do begin
if Bin[i] = '1' then
Res := Res + Power(2,l-i);
end;
// 10진수를 8진수로 변환한다
Result := DecToOct(Trunc(Res));
end;
사용법
- 16진수 -> 10진수
- 10진수 -> 2진수
- 10진수 -> 8진수
- 2진수 -> 8진수
// 16진수 FF를 10진수로 변환
ShowMessage('(16):FF->(10):'+IntToStr(HexToInteger('FF')));
// 10진수 255를 2진수로 변환
ShowMessage('(10):255->(2):'+DecToBinStr(255));
// 2진수 11111111를 16진수로 변환
ShowMessage('(2):11111111->(16):'+BinToHex('11111111',2));
// 10진수 255를 8진수로 변환
ShowMessage('(10):255->(8):'+DecToOct(255));
// 2진수 11111111를 8진수로 변환
ShowMessage('(2):11111111->(8):'+BinToOct('11111111'));'Programming > Delphi' 카테고리의 다른 글
| DirectShow 기본 Cam 프로그램 (0) | 2026.05.31 |
|---|---|
| [Delphi] SAPI 컴포넌트 등록 방법(TTS 구현) (0) | 2026.05.20 |
| [Delphi] DirectShow 강좌 (1) | 2026.05.18 |
| [Delphi] ShellContols 컴포넌트 등록법 (0) | 2026.05.15 |
| [Delphi] 웹프로그래밍 #4 - 게시판 만들기 (0) | 2026.05.13 |