首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言位圖算法實現:高效位設置、清除與測試

     編輯:關於C語言

核心代碼

#include <stdio.h>

void set_bit(void *base, unsigned long n) {
    unsigned long *m = (unsigned long *)base;
    unsigned long size = sizeof(unsigned long) * 8;  // 每塊位數(32或64)
    m[n / size] |= 1UL << (n % size);
}

void clear_bit(void *base, unsigned long n) {
    unsigned long *m = (unsigned long *)base;
    unsigned long size = sizeof(unsigned long) * 8;
    m[n / size] &= ~(1UL << (n % size));
}

int main() {
    unsigned long value[2] = {0};
    set_bit(value, 0);
    set_bit(value, 63);
    printf("Set:\n0x%016lx, 0x%016lx\n", value[0], value[1]);
    clear_bit(value, 0);
    clear_bit(value, 63);
    printf("Clear:\n0x%016lx, 0x%016lx\n", value[0], value[1]);
    return 0;
}

原理解析

  • n / size 定位數組下標。
  • n % size 定位字內位偏移。
  • 1UL << offset 生成單一位掩碼。
  • | 設置位,& ~ 清除位。
  • 使用 unsigned long 確保移位行為明確,避免符號擴展問題。

應用場景

大規模標記數組(如 Bloom Filter、內存分配器空閒塊管理、權限掩碼),極大節省內存並提升緩存命中率。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved