Đổi qua lại giữa thập phân, hex, nhị phân, bát phân cho số 8 tới 64 bit, có dấu hoặc không dấu. Bấm vào từng bit để tạo mặt nạ thanh ghi và lấy code C.

Vì sao lập trình nhúng dùng hex và nhị phân?

Thanh ghi của vi điều khiển là các dãy bit, mỗi bit bật một chức năng. Viết giá trị ở dạng nhị phân thì thấy rõ từng bit, còn hex gọn hơn: mỗi chữ số hex ứng đúng 4 bit (một nibble), nên 0x2A đọc ngay ra 0010 1010.

Bật, tắt, đảo bit trong C

REG |=  (1U << 5);   /* bật bit 5 */
REG &= ~(1U << 5);   /* tắt bit 5 */
REG ^=  (1U << 5);   /* đảo bit 5 */
if (REG & (1U << 5)) { /* bit 5 đang bật */ }

Bấm các bit trên lưới, công cụ ghép thành mặt nạ và sinh sẵn các dòng code này.

Số có dấu và bù 2

Với kiểu int8_t, giá trị 0xFF là −1 chứ không phải 255. Vi điều khiển lưu số âm theo dạng bù 2: đảo tất cả các bit rồi cộng 1. Chọn chế độ signed để nhập số âm và xem dạng hex tương ứng, hữu ích khi đọc dữ liệu cảm biến (nhiệt độ, gia tốc) trả về dạng có dấu.

Thứ tự byte (endianness)

STM32, ESP32, AVR đều là little-endian: số 0x12345678 nằm trong RAM theo thứ tự 78 56 34 12. Khi gửi số qua UART, SPI hay lưu vào EEPROM theo từng byte, hai bên phải thống nhất thứ tự này, nếu không dữ liệu nhận được sẽ bị đảo.

Bài viết liên quan