Thao tác với bit trong C, C++
Trong bài học này, bạn sẽ bật, tắt, đảo và kiểm tra từng bit trong một số nguyên để lưu nhiều trạng thái bật/tắt.
Giới thiệu
Mỗi bit trong một số nguyên có thể lưu một giá trị đúng hoặc sai. Nhờ đó, một số nguyên không dấu có thể chứa gọn nhiều tùy chọn bật/tắt độc lập, gọi là cờ (flag). Kỹ thuật dùng mặt nạ bit (bit mask) này rất phổ biến trong lập trình hệ thống và nhúng.
Những điểm quan trọng
- Kiểm thử với dữ liệu rỗng, chỉ có một phần tử, có giá trị trùng và đã được sắp xếp.
- Viết cho đúng trước, tối ưu sau.
- Trong code thực tế, ưu tiên dùng các hàm có sẵn của thư viện chuẩn.
Code ví dụ bằng C và C++
#include <stdio.h>
int main(void) {
unsigned flags = 0;
flags |= 1u << 1;
flags |= 1u << 3;
flags ^= 1u << 1;
printf("flags=%u bit3=%u\n", flags, (flags >> 3) & 1u);
}
flags=8 bit3=1
#include <bitset>
#include <iostream>
int main() {
std::bitset<4> flags;
flags.set(1);
flags.set(3);
flags.flip(1);
std::cout << "flags=" << flags
<< " bit3=" << flags.test(3) << '\n';
}
flags=1000 bit3=1
So sánh C và C++
Biểu thức 1u << n tạo một số chỉ có bit thứ n bằng 1. Toán tử |= bật bit, ^= đảo bit, và (flags >> 3) & 1u kiểm tra bit thứ 3. Sau khi bật bit 1, bit 3 rồi đảo lại bit 1, chỉ còn bit 3 được bật nên flags bằng 8. Nên dùng kiểu không dấu (unsigned) để phép dịch bit cho kết quả dễ đoán. Trong C++, std::bitset cung cấp các phương thức rõ nghĩa như set(), flip() và in kết quả dưới dạng nhị phân.
Vòng lặp, con trỏ, độ dài và vùng nhớ tạm đều được viết tường minh.
Iterator và các thuật toán chuẩn tách thao tác xử lý khỏi cách dữ liệu được lưu trữ.
Bài tập mở rộng
Hãy chạy cả hai phiên bản, sau đó thử thay đổi code để quan sát sự khác biệt về mức độ an toàn mà mỗi ngôn ngữ mang lại.
- Tự mô phỏng từng phép so sánh trên giấy.
- Thử với giá trị trùng lặp và các giá trị cực lớn, cực nhỏ.
- Đo thời gian chạy của code tự viết và so sánh với thư viện chuẩn.
Luyện tập với thử thách
Áp dụng kiến thức của bài học này để giải một bài toán thực tế. Mỗi thử thách chạy ngay trên trình duyệt, có kiểm thử tức thì và AI nhận xét.
- Lũy thừa của hai Kiểm tra xem một số có phải là lũy thừa của hai hay không. Dễ
- Số Chuyến Thang Máy Tối Thiểu Nhóm người thành số chuyến thang máy ít nhất có thể, mỗi chuyến bị giới hạn trọng lượng. Khó