Module 20: Thao tác bit nâng cao

Thao tác bit nâng cao

Bit Mask - Mặt nạ bit

#define BIT(n) (1 << n)  // bit thu n

Set/Clear/Toggle bit

int x = 0;
x |= BIT(3);    // set bit 3:  x = x | (1<<3)
x &= ~BIT(3);   // clear bit 3: x = x & ~(1<<3)
x ^= BIT(3);    // toggle bit 3: x = x ^ (1<<3)
(x & BIT(3))    // kiem tra bit 3

Kiểm tra bit

int is_set(int x, int n) { return (x >> n) & 1; }

Đếm bit 1 (Hamming weight)

int count_bits(int x) {
    int count = 0;
    while (x) { count += x & 1; x >>= 1; }
    return count;
}
// Toi uu: x & (x-1) xoa bit 1 cuoi cung
int count_bits_opt(int x) {
    int count = 0;
    while (x) { count++; x &= x - 1; }
    return count;
}

Endianness

int x = 0x12345678;
char *c = (char*)&x;
if (*c == 0x78) printf("Little endian");
else printf("Big endian");

Checksum đơn giản

char checksum(char *data, int len) {
    char sum = 0;
    for (int i = 0; i < len; i++) sum ^= data[i];
    return sum;
}

Flag pattern

#define FLAG_READ  (1 << 0)
#define FLAG_WRITE (1 << 1)
#define FLAG_EXEC  (1 << 2)
int flags = FLAG_READ | FLAG_WRITE;
if (flags & FLAG_READ) printf("Co quyen doc");