Kỹ thuật tách byte từ giá trị 16-bit dùng phép bitwise

Việc chuyển đổi dữ liệu từ định dạng 16-bit sang chuỗi byte 8-bit là thao tác phổ biến trong lập trình nhúng và xử lý giao thức truyền thông. Quá trình này dựa trên hai phép toán bitwise cơ bản: phép AND (&) để mask bits và phép dịch phải (>>) để di chuyển vị trí bit.

1. Phép AND bitwise (&)

Mục đích chính của phép toán này là cô lập các bit ở vị trí thấp (low-order bits). Khi sử dụng mask 0xFF, chúng ta giữ lại 8 bit cuối cùng và loại bỏ các bit còn lại.

Công thức:

byteThap = giaTri & 0xFF

Minh họa:

Giả sử biến sourceWords[0] chứa giá trị 0xA1B2. Biểu diễn nhị phân như sau:

10100001 10110010  (0xA1B2)

Thực hiện phép AND với 0xFF:

10100001 10110010  (0xA1B2)
&
00000000 11111111  (0xFF)
=
00000000 10110010  (0xB2)

Kết quả thu được là 0xB2.

2. Phép dịch phải (>>)

Để truy cập vào 8 bit cao (high-order bits) của một số 16-bit, ta cần dịch chuyển toàn bộ giá trị sang phải 8 vị trí. Các bit trống ở phía trái sẽ được lấp đầy bằng 0.

Công thức:

byteCao = giaTri >> 8

Minh họa:

Vẫn với giá trị 0xA1B2:

10100001 10110010  (0xA1B2)
>> 8
=
00000000 10100001  (0xA1)

Kết quả thu được là 0xA1.

3. Triển khai logic chuyển đổi

Dưới đây là cách kết hợp hai phép toán trên để điền dữ liệu vào một buffer byte theo thứ tự Little-Endian (byte thấp trước):

  • targetStream[0] = (uint8_t)(sourceWords[0] & 0xFF);: Lấy byte thấp của từ đầu tiên.
  • targetStream[1] = (uint8_t)(sourceWords[0] >> 8);: Lấy byte cao của từ đầu tiên.
  • targetStream[2] = (uint8_t)(sourceWords[1] & 0xFF);: Lấy byte thấp của từ thứ hai.
  • targetStream[3] = (uint8_t)(sourceWords[1] >> 8);: Lấy byte cao của từ thứ hai.

4. Ví dụ tổng hợp

Xét trường hợp cụ thể với dữ liệu đầu vào:

  • sourceWords[0] = 0xA1B2
  • sourceWords[1] = 0xC3D4

Thực hiện tính toán từng bước:

Phần tử 0:

0xA1B2 & 0xFF = 0xB2

Phần tử 1:

0xA1B2 >> 8 = 0xA1

Phần tử 2:

0xC3D4 & 0xFF = 0xD4

Phần tử 3:

0xC3D4 >> 8 = 0xC3

Mảng targetStream cuối cùng sẽ chứa dãy byte:

targetStream = [0xB2, 0xA1, 0xD4, 0xC3]

Thẻ: bitwise-operations data-encoding c-programming embedded-systems

Đăng vào ngày 27 tháng 8 lúc 15:13