Thuật toán C/C++

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++

C
Chạy code →
main.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);
}
Kết quả khi chạy
flags=8 bit3=1
C++
Chạy code →
main.cpp
#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';
}
Kết quả khi chạy
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.

C

Vòng lặp, con trỏ, độ dài và vùng nhớ tạm đều được viết tường minh.

C++

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.

Tất cả thử thách