20
361
1062
助理工程师
使用特权
999725d7e05e8629b3.png (55.25 KB )
下载附件
2019-9-15 17:35 上传
/*位图 2011.10.18*/ #include <stdio.h> #define MAX 1000000 #define SHIFT 5 #define MASK 0x1F #define DIGITS 32 int a[1+MAX/DIGITS]; void set(int n) //将逻辑位置为n的二进制位置为1 { a[n>>SHIFT]=a[n>>SHIFT]|(1<<(n&MASK)); //n>>SHIFT右移5位相当于除以32求算字节位置,n&MASK相当于对32取余即求位位置, } //然后将1左移的结果与当前数组元素进行或操作,相当于将逻辑位置为n的二进制位置1. void clear(int n) { a[n>>SHIFT]=a[n>>SHIFT]&(~(1<<(n&MASK))); //将逻辑位置为n的二进制位置0,原理同set操作 } int test(int n) { return a[n>>SHIFT] & (1<<(n&MASK)); //测试逻辑位置为n的二进制位是否为1 } int main(int argc, char *argv[]) { int i,n; for(i=1;i<=MAX;i++) { clear(i); } while(scanf("%d",&n)!=EOF) { set(n); } for(i=1;i<=MAX;i++) { if(test(i)) printf("%d ",i); } return 0; }
/*位图C++STL实现 2011.10.19*/ #include <iostream> #include<bitset> #define MAX 1000000 using namespace std; bitset<MAX+1> bit; //声明一个有(MAX+1)个二进制位的bitset集合,初始默认所有二进制位为0 int main(int argc, char *argv[]) { int n,i; while(scanf("%d",&n)!=EOF) { bit.set(n,1); //将第n位置1 } for(i=0;i<=MAX+1;i++) { if(bit[i]==1) printf("%d ",i); } return 0; }
发表回复 本版积分规则 回帖后跳转到最后一页
0
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注21ic项目外包
扫码关注21ic视频号
扫码关注21ic抖音号
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才 | 论坛帮助
京公网安备 11010802024343号