问题描述
我正在尝试使用按位排列Eratosthenes筛子的概念。根据我的阅读,我理解素数数组的每个元素都存储64个数字的素数状态(素数-> 0或复合数-> 1)。因此,仅1个元素就足以构成64个数字。我不明白的是该数字是如何映射到该位的,其背后的逻辑是什么?
在以下语句中: (prime [x / 64]&(1 > 1)&31)))
如果x为5,则5 >> 1 = 2(5/2 = 2),对32取模后得到2。这是否意味着第二位(64位中的第二位)对应于数字5?第二位会保留数字5的主要状态吗?
我想了解我们得出2的依据(为什么我们右移2位然后对32取模),以及其背后的逻辑是什么?我也运行了程序并尝试调试以更好地理解它,发现素数数组中的元素有时变为负数。素数数组的数据类型为int,因此其中的每个元素的类型均为int(32位)。一个int(32位)如何存储64位的素数状态(64个数字需要64位来存储我猜的状态)
如果有人可以帮助我,这将是有帮助的!我在堆栈溢出中查看了其他类似的问题,但仍然无法理解,这就是为什么我要再次发布。请让我知道如何使问题变得更好,因为我是堆栈溢出的新手。
#include <bits/stdc++.h>
using namespace std;
bool ifnotPrime(int prime[],int x)
{
return (prime[x/64] & (1 << ((x >> 1) & 31)));
}
bool makeComposite(int prime[],int x)
{
prime[x/64] |= (1 << ((x >> 1) & 31));
}
void bitWiseSieve(int n)
{
int prime[n/64];
memset(prime,sizeof(prime));
for (int i = 3; i * i <= n; i += 2) {
if (!ifnotPrime(prime,i))
for (int j = i * i,k = i << 1; j < n; j += k)
makeComposite(prime,j);
}
printf("2 ");
for (int i = 3; i <= n; i += 2)
if (!ifnotPrime(prime,i))
printf("%d ",i);
}
int main()
{
int n = 30;
bitWiseSieve(n);
return 0;
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)