#include <stdio.h> #include <stdlib.h> #define SHIFT 5 #define MASK 0x1F /** * 設置所在的bit位爲1 * * T = O(1) * */ void set(int n, int *arr) { int index_loc, bit_loc; index_loc = n >> SHIFT; // 等價於n / 32 bit_loc = n & MASK; // 等價於n % 32 。 h%2^n = h & (2^n -1) arr[index_loc] |= 1 << bit_loc; } /** * 初始化arr[index_loc]全部bit位爲0 * * T = O(1) * */ void clr(int n, int *arr) { int index_loc; index_loc = n >> SHIFT; arr[index_loc] &= 0; } /** * 測試n所在的bit位是否爲1 * * T = O(1) * */ int test(int n, int *arr) { int i, flag; i = 1 << (n & MASK); flag = arr[n >> SHIFT] & i; return flag; } int main(void) { int i, num, space, *arr; while (scanf("%d", &num) != EOF) { // 肯定大小&&動態申請數組 space = num / 32 + 1; arr = (int *)malloc(sizeof(int) * space); // 初始化bit位爲0 for (i = 0; i <= num; i ++) clr(i, arr); // 設置num的比特位爲1 set(num, arr); // 測試 if (test(num, arr)) { printf("成功!\n"); } else { printf("失敗!\n"); } } return 0; }
MARK 補充 Java 實現html
參考:http://www.cnblogs.com/dyllove98/archive/2013/07/26/3217741.html算法