繁体   English   中英

我该如何使用64位而不是32位解决按位seive? 两者有什么区别?

[英]How can I solve bitwise seive using 64 bit instead of 32 bit? What is the difference between these two?

#define SZ 100000010
long long int status[SZ/64+1];
bool check( long long int N, long long int pos)
{
    return (bool)(N & (1<<pos));
}
long long int Set( long long int N, long long int pos)
{
    return N=N | (1<<pos);
}
void bitwise_seive()
{
    long long int cnt=1;
    for( long long int i=3; i<=sqrt(SZ); i+=2)
    {
        if(check( status[i>>6], ((i>>1)&31))==0)
        {
            for( long long int j=i*i; j<=SZ; j+=(i*2))
            {
                status[j>>6]=Set( status[j>>6], (j>>1)&31);
            }
        }
    }
}

在第20行:

Set( status[j>>6], (j>>1)&31)

这意味着什么?

如果我这样做:

Set( status[j>>5], j&31) 

代替:

Set( status[j>>6], (j>>1)&31)

有什么区别?

基本上,您的标志为64个整数,一个64位长long int中的每个位一个。 首先,它可能应该是unsigned ,因为您可以拥有1 << 63 (并且NathanOliver说1LLU << )。

31是0x1F ,因此您要强制将偏移小于31,以便此偏移没有问题(在32位版本中,未签名的IMHO仍然存在问题)。

您执行的两个操作是完全不同的操作。 进行移位j>>1以除去偶数,因为我们知道这些绝不是质数(请参阅j+=2*i )。

所以这里有两件事:

  • (j>>1)&31取消了对偶数的支持,因为增加了2*i
  • status[j>>6]j选择数组中的适当元素。 但是,您在此处选择的值是错误的,因为long long int中有8个字节,而不是6个。同样由于先前的偏移,我会假定该值可能是9个。

编辑:关于status[j>>6]错误陈述status[j>>6]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM