Nội dung bài viết
Nguyễn Nghĩa Hệ thập lục phân tên tiếng Anh là Hexadecimal, đơn thuần gọi là thập lục, là một hệ cơ số có 16 kí tự 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.

Giới thiệu

Đố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.

Tiền đề bài viết

Trong những ngày đầu tiếp xúc với hệ cơ số 16, tôi đã gặp phải những khó khăn trong việc chuyển đổi giữa các hệ thống số khác nhau, đặc biệt là hệ cơ số 16. Sau một thời gian tìm hiểu thì tôi quyết định viết bài này để chia sẽ kiến thức của mình và hy vọng sẽ có ích đối với các bạn.

Đối tượng hướng đến

Bài viết này dành cho các độc giả có sự quan tâm đến hệ cơ số 16, đang gặp khó khăn trong việc tiếp xúc và sử dụng hệ đếm này. Các độc giả khác cũng có thể tham khảo để tích lũy kiến thức.

Lịch sử ra đời

Hệ cơ số thập lục phân hiện dùng, được công ty IBM :: vi.wikipedia.org/wiki/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í từ 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

ss_01

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

ss_03

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:

ss_04

Ví dụ

Tôi sẽ 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 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;
	}
}

Thực hiện hàm main:

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

Download demo

Bạn có thể tham khảo demo chi tiết tại đây: DemoHex

THẢO LUẬN
ĐÓNG