使用位掩码生成素数导致程序崩溃

Prime generating with bit masking is causing programme to crash

本文关键字:程序 崩溃 生成素 掩码      更新时间:2023-10-16

在下面的代码中,我使用了比特掩码来生成素数,但不幸的是,它不能正常工作,而这个程序正在崩溃跑步时。

#include <bits/stdc++.h>
#define maxn 65540
using namespace std;
int _c[(maxn>>6)+1];  //as we will be neede max
int  primes[maxn];

#define IsComp(n)  (_c[n>>6]&(1<<((n>>1)&31)))//to compare bit
#define SetComp(n) _c[n>>6]|=(1<<((n>>1)&31))//to set the bit
void prime_sieve() {
for (int i = 3; i <=maxn; i += 2)
    if (!IsComp(i))
        for (int j = i*i; j <=maxn; j += i+i)
            SetComp(j);//if the number is not primes then it is changed     to  1
primes[0]=2;//first prime is 2;
int   j=1;
for (int i=3; i <= maxn; i += 2)
    if (!IsComp(i))
        primes[j++]=i;//putting the value in primes array;
}
int main()
{
prime_sieve();//calling the function
//Prime();
}

根据我的理解当外循环(i)运行到46348时,它工作得很好,因为i*i在2147483648范围内,但当i变为46349时,j值出现整数溢出,其值变为-2146737495,然后跟随setComp(j),j为负。