Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 按位形式实现对埃拉奥斯坦的筛选_C++_Bit Manipulation_Sieve Of Eratosthenes - Fatal编程技术网

C++ 按位形式实现对埃拉奥斯坦的筛选

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的基本状态 我想了解我们

我正在尝试学习将按位用于埃拉托什烯筛的概念。从我所读的内容中,我了解到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位来存储状态)

如果有人能帮我,那就太好了!我看了其他关于堆栈溢出的类似问题,但仍然无法理解这就是我再次发布的原因。请让我知道我如何能使问题更好,因为我是新的堆栈溢出

 
#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我仍然对此感到困惑