Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Các hàm builtin của trình biên dịch GCC trong C++

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àmChức năngLưu ý
__builtin_popcountĐếm bit 1Dùng cho bitmask, bitset
__builtin_parityParity bitChecksum đơn giản
__builtin_clzĐếm 0 dẫn đầuUB nếu x=0; dùng tìm MSB: 31-__builtin_clz(x)
__builtin_ctzĐếm 0 cuốiUB 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ấp std::popcount, std::countl_zero, std::countr_zero – chuẩn, portable.