Hệ cơ số 16 (Hexadecimal)
Hex dùng 16 ký hiệu: 0-9 và A-F (hoặc a-f).
| Hex | Dec | Hex | Dec |
|---|---|---|---|
| 0-9 | 0-9 | A/a | 10 |
| B/b | 11 | ||
| C/c | 12 | ||
| D/d | 13 | ||
| E/e | 14 | ||
| F/f | 15 |
Thuật toán chuyển đổi (Hand calculation)
Ví dụ: A12 (hex) → Decimal
A 1 2
│ │ │
│ │ └─ 2 × 16⁰ = 2 × 1 = 2
│ └──── 1 × 16¹ = 1 × 16 = 16
└────── A(10) × 16² = 10 × 256 = 2560
─────────────────────────
Tổng = 2578
Chương trình C: Hàm chuyển đổi
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
int hexToDec(const char *hex) {
int len = strlen(hex);
int dec = 0;
// Duyệt từ phải sang trái (chữ số thấp → cao)
for (int i = len - 1, power = 0; i >= 0; i--, power++) {
char c = toupper(hex[i]); // Chấp nhận cả chữ thường
int val;
if (c >= '0' && c <= '9') {
val = c - '0';
} else if (c >= 'A' && c <= 'F') {
val = c - 'A' + 10;
} else {
printf("Ky tu khong hop le: %c\n", c);
return -1;
}
dec += val * (int)pow(16, power);
}
return dec;
}
int main() {
char hex[100];
printf("Nhap so hex: ");
scanf("%s", hex);
int dec = hexToDec(hex);
if (dec != -1) {
printf("Decimal: %d\n", dec);
printf("Hex: 0x%X\n", dec); // In ngược lại dạng hex
}
return 0;
}
Kết quả
Nhap so hex: A
Decimal: 10
Hex: 0xA
Nhap so hex: A12
Decimal: 2578
Hex: 0xA12
Nhap so hex: ff
Decimal: 255
Hex: 0xFF
Cách 2: Dùng sscanf (Chuẩn thư viện)
#include <stdio.h>
int main() {
char hex[100];
unsigned int dec;
printf("Nhap so hex: ");
scanf("%s", hex);
// %x đọc hex, %X cũng được
if (sscanf(hex, "%x", &dec) == 1) {
printf("Decimal: %u\n", dec);
} else {
printf("Dinh dang hex khong hop le!\n");
}
return 0;
}
Cách 3: Duyệt trái sang phải (Hiệu quả hơn)
int hexToDecLeftToRight(const char *hex) {
int dec = 0;
for (int i = 0; hex[i]; i++) {
char c = toupper(hex[i]);
int val;
if (c >= '0' && c <= '9') val = c - '0';
else if (c >= 'A' && c <= 'F') val = c - 'A' + 10;
else return -1;
dec = dec * 16 + val; // Dịch trái 1 hex digit = nhân 16
}
return dec;
}
Cách này không cần pow(), không cần math.h, nhanh hơn.
Chương trình hoàn chỉnh: Chuyển đổi 2 chiều
#include <stdio.h>
#include <ctype.h>
int hexToDec(const char *hex) {
int dec = 0;
for (int i = 0; hex[i]; i++) {
char c = toupper(hex[i]);
int val = (c >= '0' && c <= '9') ? c - '0' : c - 'A' + 10;
if (val < 0 || val > 15) return -1;
dec = dec * 16 + val;
}
return dec;
}
void decToHex(int dec, char *hex) {
if (dec == 0) { hex[0] = '0'; hex[1] = '\0'; return; }
char buf[20];
int i = 0;
while (dec > 0) {
int r = dec % 16;
buf[i++] = (r < 10) ? '0' + r : 'A' + r - 10;
dec /= 16;
}
// Đảo ngược
for (int j = 0; j < i; j++) hex[j] = buf[i - 1 - j];
hex[i] = '\0';
}
int main() {
char hex[20], hex2[20];
int dec;
printf("Nhap hex: "); scanf("%s", hex);
dec = hexToDec(hex);
if (dec >= 0) {
printf("Dec: %d\n", dec);
decToHex(dec, hex2);
printf("Hex lai: %s\n", hex2);
}
return 0;
}
Lưu ý
- Hex thường dùng tiền tố
0x(VD:0xFF), nhưng nhập không cần - Dùng
unsignedcho số hex lớn (tránh dấu âm) printf("%X", n)in hex in hoa,%xin thường- Kiểm tra input hợp lệ (chỉ 0-9, A-F, a-f)