C++ 按位形式实现对埃拉奥斯坦的筛选
我正在尝试学习将按位用于埃拉托什烯筛的概念。从我所读的内容中,我了解到prime数组的每个元素都存储64个数字的prime状态(prime->0或composite->1)。因此,仅1个元素就足以容纳64个数字。我不明白的是这个数字是如何映射到那个位的,它背后的逻辑是什么 在以下声明中: (素数[x/64]&(1>1)和(31))) 如果x是5,那么5>>1=2(5/2=2),在模32之后我们得到2。这是否意味着第2位(64位中的第2位)对应于数字5?第二位是否保持数字5的基本状态 我想了解我们在什么基础上得出2(为什么我们右移2位,然后模32)以及它背后的逻辑是什么。我还运行了这个程序,并试图调试以更好地理解它,发现prime数组中的元素在某个点上变为负值。素数数组的数据类型为int,因此其中的每个元素的类型为int(32位)。int(32位)如何存储64个数字的基本状态(我猜64个数字需要64位来存储状态) 如果有人能帮我,那就太好了!我看了其他关于堆栈溢出的类似问题,但仍然无法理解这就是我再次发布的原因。请让我知道我如何能使问题更好,因为我是新的堆栈溢出C++ 按位形式实现对埃拉奥斯坦的筛选,c++,bit-manipulation,sieve-of-eratosthenes,C++,Bit Manipulation,Sieve Of Eratosthenes,我正在尝试学习将按位用于埃拉托什烯筛的概念。从我所读的内容中,我了解到prime数组的每个元素都存储64个数字的prime状态(prime->0或composite->1)。因此,仅1个元素就足以容纳64个数字。我不明白的是这个数字是如何映射到那个位的,它背后的逻辑是什么 在以下声明中: (素数[x/64]&(1>1)和(31))) 如果x是5,那么5>>1=2(5/2=2),在模32之后我们得到2。这是否意味着第2位(64位中的第2位)对应于数字5?第二位是否保持数字5的基本状态 我想了解我们
#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, 0, 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;
}
#包括
使用名称空间std;
布尔ifnotPrime(int prime[],int x)
{
返回(素数[x/64]&(1>1)和31));
}
bool-makeComposite(int-prime[],int-x)
{
素数[x/64]|=(1>1&31));
}
void位筛(int n)
{
整数素数[n/64];
memset(prime,0,sizeof(prime));
对于(int i=3;i*我认为它只存储奇数,因此32位的32个奇数涵盖了64个奇数和偶数的范围。你已经有一个例外,打印2,然后打印循环只循环奇数。嗨@Rup,多亏了你的回答,我现在理解得更多了。这与右移2和模32有关吗?i我仍然对此感到困惑