博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编程珠玑第一章
阅读量:5258 次
发布时间:2019-06-14

本文共 912 字,大约阅读时间需要 3 分钟。

 
整个程序的思想就是:
            1.每个整数有32位,那么它就可以表示32个数,分别对应每bit位为1.
            2.然后把10000000个数分为1+N/BITSPERWORD组(相当于有这么多个桶),每组包含接近32个数。
上面的解释可能仍不到位,那我们来看具体的函数:
 
对于set函数,我们可以这样理解,
             arr[i>>SHIFT] |= (1<<(i&MASK))可以转化为
             arr[i/32] = arr[i/32] | (1<<(i%32))
i%32必然处于区间[0, 31],那么1<<(i%32)就是将bit位1向前移动(i%32)位,然后和arr[i/32]相或,因而arr[i/32]的第(i%32)位就为1.
#include 
#define BITPERWORD#define MASK 0x1F#define N 10000000#define SHIFT 5int a[N/BITPERWORD + 1];void clr_bit(int i){a[i>>SHIFT] &= ~(1 << i & MASK);}void set_bit(int i){a[i>>SHIFT] |= 1<<(i & MASK);}int test_bit(int i){ return a[i >> SHIFT] & (1 << (i & MASK));}int main(){int i = 0;FILE * in = freopen("in.txt","r",stdin);FILE * out = freopen("out.txt","w",stdout);while (scanf("%d",&i) != EOF){set_bit(i);}for (i = 0;i < 100000 ;++i){ if(test_bit(i)) printf("%d\n",i);}fclose(in);fclose(out); //printf("%d\n",tmp); return 0;}

 

转载于:https://www.cnblogs.com/liuweilinlin/p/3180539.html

你可能感兴趣的文章
爬虫学习笔记(一)初识爬虫
查看>>
生成随机数的模板
查看>>
SpringMVC文件上传
查看>>
hdu 2093
查看>>
进程描述符task_struct
查看>>
C++调用WCF
查看>>
Android 2D Graphics学习 Region和Canvas裁剪
查看>>
249. Group Shifted Strings
查看>>
如无必要,勿增实体 2012-03-08 17:17
查看>>
纸上谈兵: 树, 二叉树, 二叉搜索树[转]
查看>>
第一篇随笔
查看>>
Java中Date类型的工具类
查看>>
WebStorm快捷键收集
查看>>
testng,soket write error错误
查看>>
javaScript中string对象的方法
查看>>
跑一段代码遍历所有汉字
查看>>
生产者/消费者模式(二)
查看>>
Leetcode 226 Invert Binary Tree
查看>>
JAVA-初步认识-第十三章-多线程(卖票示例)
查看>>
[译]转译器: 今日大不同
查看>>