[英]How can I resolve a conflict between 32-bit and 64-bit libraries for GMP?
[英]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.