Search…

Tìm Hiểu Hệ Cơ Số 16 – Hexadecimal

05/10/20204 min read
Hệ thập lục phân - Hexadecimal và cách chuyển đổi và cài đặt chuyển đổi bằng ngôn ngữ lập trình.

Đối với mỗi lập trình viên, hệ cơ số thập lục phân (hay còn gọi là hệ 16) là một khái niệm quen thuộc và không kém phần quan trọng. Trong bài viết này, tác giả sẽ cùng các bạn tìm hiểu về hệ cơ số 16, cũng như cách chuyển đổi từ các hệ cơ số khác qua hệ cơ số này và cài đặt chúng bằng ngôn ngữ lập trình.

Lịch sử ra đời

Hệ cơ số thập lục phân hiện nay được công ty IBM giới thiệu với thế giới điện toán vào năm 1963. Tiền thân của hệ thập lục phân là hệ thống sử dụng trong máy tính Bendix G-15. Hệ thống này gồm các kí số từ 0 đến 9, và kí tự từ A đến F.

Tổng quan về hệ cơ số thập lục phân

Hệ thập lục phân tên tiếng anh là Hexadecimal, hay còn gọi là hệ 16, là một hệ đếm có 16 kí số 0 đến 9 và A đến F (không phân biệt chữ hoa và chữ thường), với quy tắc:

  • A = 10
  • B = 11
  • C = 12
  • D = 13
  • E = 14
  • F = 15

Chuyển đổi các hệ đếm qua hệ thập lục

Hệ thập phân chuyển qua hệ thập lục phân

+—————————————+       +—————————————+
|             |       |             |
|   DECIMAL   |   →   | HEXADECIMAL |
|             |       |             |
+—————————————+       +—————————————+

Giải thuật

  • Bước 1: Thực hiện phép chia nguyên của số thập phân cần chuyển cho 16 và ghi nhớ lại kết quả dư.
  • Bước 2: Nếu thương số của phép chia khác 0, thì tiếp tục lặp lại bước 1. Ngược lại chuyển qua bước 3.
  • Bước 3: Ghi ngược các số dư theo thứ tự ngược lại.

Ví dụ

Ở đây tôi sẽ thực hiện một ví dụ chuyển số : 923(10) = ?(16)

  • Lần 1: 923/16 được 57 dư 11 (tương đương với B trong hexa)
  • Lần 2: 57/16 được 3 dư 9
  • Lần 3: 3/16 được 0 dư 3 và dừng lại.
  • Viết các số dư theo thứ tự ngược lại, và ta được:

Sơ đồ thực hiện

ss_02

Hệ nhị phân chuyển qua hệ thập lục phân

+————————————+       +—————————————+
|            |       |             |
|   BINARY   |   →   | HEXADECIMAL |
|            |       |             |
+————————————+       +—————————————+

Giải thuật

  • Bước 1: Nhóm 4 bits từ phía ngoài cùng bên phải của số nhị phân.
  • Bước 2: Chuyển đổi mỗi nhóm trên sang số thập lục tương ứng theo bảng dưới đây:
HEX BIN
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
A 1010
B 1011
C 1100
D 1101
E 1110
F 1111

Ví dụ

Thực hiện chuyển số nhị phân: 110101101010111001101010(2) = ?(16)

  • Bước 1: Nhóm lần lượt 4 bit từ phải sáng trái ta được:
    • 1101 0110 1010 1110 0110 1010
  • Bước 2: chuyển mỗi nhóm 4 bits sang số thập lục phân ta được kết quả:
    • 1101 0110 1010 1110 0110 1010
         D    6    A    E    6    A

Vậy ta được 110101101010111001101010(2) = D6AE6A(16)

Hệ đếm thập lục trong C/C++

Trong C/C++ kí tự "0x" được sử dụng làm tiền tố cho các số thập lục phân, chẳng hạn "0x5A3". Số không (0) dẫn đầu được dùng để bộ thanh lọc mã (parser) có thể trực tiếp nhận biết một con số, trong khi chữ "x" đại biểu cho chữ hexadecimal (thập lục phân). Chữ "x" trong tiền tố "0x" có thể được viết hoa (0X) hoặc viết thường (0x), song thường thấy được viết thường.

Chúng ta có thể gán giá trị cho biến ở thệ thập lục phân như sau: int a = 0x5a3;

Và xuất ra màn hình giá trị của biến a theo hệ thập lục phân: printf("0x%x", a);

Tương tự xuất ra màn hình theo kiểu hệ thập phân: printf("%d", a);

Cài đặt thuật toán chuyển đổi

Trên cơ sở giải thuật ở trên, tôi tiến hành cài đặt hàm ConvertDecToHex với hai tham số là n kiểu int, và des kiểu char* để chuyển đổi từ hệ thập phân sang hệ thập lục phân.

Cài đặt hàm ConvertDecToHex:

void ConvertDecToHex(int n, char* des)
{
	int remember;
	int i 	= 0;
	while (n != 0)
	{
		remember = n % 16;
		n /= 16;
 
		switch (remember)
		{
		case 0:
		case 1:
		case 2:
		case 3:
		case 4:
		case 5:
		case 6:
		case 7:
		case 8:
		case 9:
			des[i] = remember + '0';
			break;
		case 10:
			des[i] = 'a';
			break;
		case 11:
			des[i] = 'b';
			break;
		case 12:
			des[i] = 'c';
			break;
		case 13:
			des[i] = 'd';
			break;
		case 14:
			des[i] = 'e';
			break;
		case 15:
			des[i] = 'f';
			break;
		default:
			break;
		}
		i++;
	}
	des[i] = '\0';
	for (int count = 0; count < i/2; count++)
	{
		char temp 			    = des[count];
		des[count] 			    = des[i - count - 1];
		des[i - count - 1] 	    = temp;
	}
}

Hiện thực hàm main:

int main()
{
	char *hex = new char[10];
	ConvertDecToHex(23524, hex);
	std::cout << hex << std::endl;
	return 0;
}
IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024