GCC cung cấp các hàm builtin (hàm nội sinh) – được trình biên dịch hiểu ngữ nghĩa và tối ưu hóa mạnh (thường thành lệnh máy đơn lẻ). Dưới đây là nhóm hàm thao tác bit phổ biến.
1. __builtin_popcount(x) – Đếm bit 1
Trả về số bit 1 trong biểu diễn nhị phân của unsigned int x.
#include <iostream>
using namespace std;
int main() {
int n = 13; // 1101₂
cout << "Count of 1s in binary of " << n << " is " << __builtin_popcount(n);
return 0;
}
Count of 1s in binary of 13 is 3
Biến thể: __builtin_popcountl (unsigned long), __builtin_popcountll (unsigned long long).
2. __builtin_parity(x) – Kiểm tra chẵn/lẻ số bit 1
Trả về 1 nếu số bit 1 là lẻ (odd parity), 0 nếu chẵn (even parity).
int n = 13; // 1101₂ -> 3 bit 1 -> lẻ cout << __builtin_parity(n); // 1
Parity of 13 is 1
3. __builtin_clz(x) – Đếm số 0 dẫn đầu (Count Leading Zeros)
Số bit 0 từ MSB đến bit 1 đầu tiên. Hành vi không xác định nếu x = 0.
int n = 13; // 32-bit: 0000...00001101 cout << __builtin_clz(n); // 28
Leading zero count of 13 is 28
Biến thể: __builtin_clzl, __builtin_clzll.
4. __builtin_ctz(x) – Đếm số 0 cuối (Count Trailing Zeros)
Số bit 0 từ LSB đến bit 1 đầu tiên. Hành vi không xác định nếu x = 0.
int n = 12; // 1100₂ cout << __builtin_ctz(n); // 2
Trailing zero count of 12 is 2
Bảng tóm tắt
| Hàm | Chức năng | Lưu ý |
|---|---|---|
__builtin_popcount | Đếm bit 1 | Dùng cho bitmask, bitset |
__builtin_parity | Parity bit | Checksum đơn giản |
__builtin_clz | Đếm 0 dẫn đầu | UB nếu x=0; dùng tìm MSB: 31-__builtin_clz(x) |
__builtin_ctz | Đếm 0 cuối | UB nếu x=0; dùng tìm LSB: __builtin_ctz(x) |
Các builtin hữu ích khác
__builtin_expect(cond, val)– gợi ý branch prediction.__builtin_constant_p(expr)– kiểm tra biểu thức hằng số compile-time.__builtin_types_compatible_p(t1, t2)– kiểm tra kiểu tương thích.__builtin_unreachable()– báo cho compiler biết code không bao giờ chạy đến.
Lưu ý
- Chỉ hoạt động trên GCC/Clang (MSVC có intrinsic riêng).
- Include
<intrin.h>trên MSVC cho các intrinsic tương đương. - C++20:
<bit>cung cấpstd::popcount,std::countl_zero,std::countr_zero– chuẩn, portable.