C++学习之【使用位操作符求素数分析】
来源:互联网 发布:数据分析实验室 编辑:程序博客网 时间:2024/06/03 10:28
#include <iostream>using namespace std;void getPrime_1(){ const int MAXN = 100; bool flag[MAXN]; int primes[MAXN / 3 + 1], pi=0; primes[pi++]=2; //2 是一个素数,先记录下来 int i, j; for(i=0;i<MAXN;++i)flag[i]=false;//全部置假,没访问一个,相应位置真 for (i = 3; i < MAXN; i+=2){//大于2的偶数一定不是素数,所以只要判断奇数即可 if (!flag[i])//如果是素数 { primes[pi++] = i; for (j = i; j < MAXN; j += i)//i的倍数一定都不是素数 flag[j] = true; } } for(i=0;i<pi;++i) cout<<primes[i]<<" "; cout<<endl;}这里使用了素数表,每一个bool型占用1个字节,共8位二进制位。而且这里除了多用了很多的无用bool变量在flag数组里,可以看到,我们使用的flag数组只用到2号位之后的所有奇数位。因此,这里可以进行压缩改进一下:将flag数组减少一半使用位操作符使空间占用减少为原来的八分之一这里使用到对指定位置置1的操作:对于一个整数X可以通过将1左移n位后,与X进行或操作,使X的第n位置1。int X=0;int n=10;X |= 1<< n; // 将 X 的第 n 位置 1所以根据上面两条,优化后的代码如下:void getPrime_2(){ const int MAXN = 200; const int BitN=(MAXN/2)/32+1;// int flag[BitN]; int primes[MAXN / 3 + 1], pi=0; primes[pi++]=2; //2 是一个素数,先记录下来 int i, j; for(i=0;i<BitN;++i)flag[i]=0;//全置0,每访问过一个,相应位置1 for (i = 3; i < MAXN; i+=2){ //大于2的偶数一定不是素数,所以只要判断奇数即可 if (!((flag[(i/2) / 32] >> ((i/2) % 32)) & 1)) { primes[pi++] = i; //i的倍数一定都不是素数,其中,j加上一个i后为偶数,上一级已经不考虑了,所以还要加上一个i for (j = i; j < MAXN; j =j+i+i) flag[(j/2) / 32] |= (1 << ((j/2) % 32)); } } for(i=0;i<pi;++i) cout<<primes[i]<<" "; cout<<endl;}首先,根据最大数,判断需要32的整型多少个:
#include <iostream>using namespace std;void getPrime_1(){ const int MAXN = 100; bool flag[MAXN]; int primes[MAXN / 3 + 1], pi=0; primes[pi++]=2; //2 是一个素数,先记录下来 int i, j; for(i=0;i<MAXN;++i)flag[i]=false;//全部置假,没访问一个,相应位置真 for (i = 3; i < MAXN; i+=2){//大于2的偶数一定不是素数,所以只要判断奇数即可 if (!flag[i])//如果是素数 { primes[pi++] = i; for (j = i; j < MAXN; j += i)//i的倍数一定都不是素数 flag[j] = true; } } for(i=0;i<pi;++i) cout<<primes[i]<<" "; cout<<endl;}这里使用了素数表,每一个bool型占用1个字节,共8位二进制位。而且这里除了多用了很多的无用bool变量在flag数组里,可以看到,我们使用的flag数组只用到2号位之后的所有奇数位。因此,这里可以进行压缩改进一下:将flag数组减少一半使用位操作符使空间占用减少为原来的八分之一这里使用到对指定位置置1的操作:对于一个整数X可以通过将1左移n位后,与X进行或操作,使X的第n位置1。int X=0;int n=10;X |= 1<< n; // 将 X 的第 n 位置 1所以根据上面两条,优化后的代码如下:void getPrime_2(){ const int MAXN = 200; const int BitN=(MAXN/2)/32+1;// int flag[BitN]; int primes[MAXN / 3 + 1], pi=0; primes[pi++]=2; //2 是一个素数,先记录下来 int i, j; for(i=0;i<BitN;++i)flag[i]=0;//全置0,每访问过一个,相应位置1 for (i = 3; i < MAXN; i+=2){ //大于2的偶数一定不是素数,所以只要判断奇数即可 if (!((flag[(i/2) / 32] >> ((i/2) % 32)) & 1)) { primes[pi++] = i; //i的倍数一定都不是素数,其中,j加上一个i后为偶数,上一级已经不考虑了,所以还要加上一个i for (j = i; j < MAXN; j =j+i+i) flag[(j/2) / 32] |= (1 << ((j/2) % 32)); } } for(i=0;i<pi;++i) cout<<primes[i]<<" "; cout<<endl;}首先,根据最大数,判断需要32的整型多少个:
0 0
- C++学习之【使用位操作符求素数分析】
- C语言学习之位操作符的使用
- C语言学习之位操作
- 位操作之求绝对值
- C语言学习笔记之位运算求余
- 我的c学习:求素数
- c之筛选法求素数
- C语言之位操作符
- C语言位操作符的使用
- C语言位操作符的使用
- C/C++ 位操作符使用
- C语言位操作符的使用
- C语言位操作符的使用
- 记录自已学习之位操作符
- c高级之---位操作
- c语言的操作符之按位操作符
- c++(位操作符)
- [C]位操作符
- Sass和Compass的神秘面纱
- DEDE发生Fatal error: Call to a member function read() on a non-object in 错误解决方法
- JSP环境集成包 工具
- poj 2555 Drink, on Ice 物理坐标计算
- 编码实践五要诀
- C++学习之【使用位操作符求素数分析】
- MINA源码简易剖析(一)
- Java学习之-动态编译-DynamicCompile_反射调用
- ios开发-OC的初步学习
- #define XXX do{ XXX } while(0) 为什么会有这种用法
- android IntentService生命周期问题
- 就这么开始吧
- 设计模式之策略模式——角色游戏
- SQL 行列倒置