STDIO
Tìm kiếm gần đây
    • Nội dung
    • QR Code
    • 0
    • 0
    • Sao chép

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

    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.
    05/10/2015
    05/10/2020
    4 phút đọc
    Tìm Hiểu Hệ Cơ Số 16 – Hexadecimal

    Đố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;
    }
    0 Bình luận

    Đề xuất

      Khi bạn nhấn vào sản phẩm do chúng tôi đề xuất và mua hàng, chúng tôi sẽ nhận được hoa hồng. Điều này hỗ trợ chúng tôi có thêm kinh phí tạo nhiều nội dung hữu ích. Tìm hiểu thêm.
      STDIO

      Trang chính

      Công ty TNHH STDIO

      30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
      +84 28.36205514 - +84 942.111912
      developer@stdio.vn

      383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
      Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012

      Đã thông báo Bộ Công Thương
      ©STDIO, 2013 - 2020