微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

以位形式实现橡皮擦筛

如何解决以位形式实现橡皮擦筛

我正在尝试使用按位排列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 举报,一经查实,本站将立刻删除。