c语言实现数组实现map6,C语言实现bitmap,取两个数组的交集等操作

bitmap的基本操作:

#include #include #define WORD 32 #define SHIFT 5 移动5个位,左移则相当于乘以32,右移相当于除以32取整 #define MASK 0x1F //16进制下的31 #define N 10000000 /* * 置位函数——用"|"操作符,i&MASK相当于mod操作 * m mod n 运算,当n = 2的X次幂的时候,m mod n = m&(n-1) */ void set(int *bitmap, int i) { bitmap[i >> SHIFT] |= (1 << (i & MASK)); } /* 清除位操作,用&~操作符 */ void clear(int *bitmap, int i) { bitmap[i >> SHIFT] &= ~(1 << (i & MASK)); } /* 测试位操作用&操作符 */ int test(int *bitmap, int i) { return bitmap[i >> SHIFT] & (1 << (i & MASK)); }

排序:

void sort() { int bitmap[1 + N / WORD]; FILE *in = fopen("in.txt", "r"); FILE *out = fopen("out.txt", "w"); if (in == NULL || out == NULL) { exit(-1); } int i = 0; int m; for (i = 0; i < N; i++) { clear(bitmap, i); } while (!feof(in)) { fscanf(in, "%d", &m); printf("%d/n", m); set(bitmap, m); } printf("abnother"); for (i = 0; i < N; i++) { if (test(bitmap, i)) { printf("%d/n", i); fprintf(out, "%d/n", i); } } fclose(in); fclose(out); }

求交集:

//合并两个数组,去交集 void merge() { int A[] = { 1, 3, 5, 7, 9, 435, 3454, 345543, 3453455 }; int B[] = { 4, 5, 6, 8, 9, 435, 3454, 345543 }; int bitmapA[1 + N / WORD]; int bitmapB[1 + N / WORD]; int i = 0; int j = 0; for (i = 0; i < N; i++) { clear(bitmapA, i); clear(bitmapB, i); } for (i = sizeof(A) / sizeof(*A) - 1; i >= 0; i--) { set(bitmapA, *(A + i)); } for (j = sizeof(B) / sizeof(*B) - 1; j >= 0; j--) { set(bitmapB, *(B + j)); } for (i = 0; i < N; i++) { if (test(bitmapA, i) & test(bitmapB, i)) {//交集 printf("%d/n", i); } } } int main(void) { //sort(); merge(); return EXIT_SUCCESS; }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值