- 假如需要在一堆数字当中快速找到一个数是否存在在这堆数组中
- 例如:2,5,9,55 ,需确定55是否存在在这堆数组中
- 我们都应该知道1个字节有8位二进制(硬件的基本单位是位(bit),1位代表的就是0或1)
- 简洁版
char* initBit(int* nums, int numsSize, int mallocSize) {
char* origin = (char*)malloc(mallocSize);
memset(origin, 0, mallocSize);
for (int i = 0; i < numsSize; i++) {
char* position = origin + nums[i] / 8;
*position = *position | (1 << (nums[i] % 8));
}
return origin;
}
bool query(char* memory, int value) {
memory = memory + value / 8;
return *memory & (1 << (value % 8));
}
- 注释版
#include
#include
char* initBit(int* nums, int numsSize, int mallocSize) {
//分配一块mallocSize大小的内存
char* origin = (char*)malloc(mallocSize);
//将这块内存中所有字节置空
memset(origin, 0, mallocSize);
for (int i = 0; i < numsSize; i++) {
//指向具体的字节
char* position = origin + nums[i] / 8;
//指向具体位(bit) 取8的余数,假设余x,1就左移x(因为1的二进制就是1)
*position = *position | (1 << (nums[i] % 8));
}
return origin;
}
bool query(char* memory, int value) {
//指向具体的字节
memory = memory + value / 8;
//指向具体位(bit)
return *memory & (1 << (value % 8));
}
int main(void) {
int nums[8] = { 75, 5, 99 };
char* memory = initBit(nums, sizeof(nums) / sizeof(nums[0]), 1024);
int input = 1;
while (input) {
scanf_s("%d", &input);
printf("是否存在:%d\n",query(memory, input));
}
return 0;
}
------------奇牛学院
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)