c - 使用位数组的埃拉托斯特尼筛法

标签 c sieve-of-eratosthenes bitarray

我有一个 unsigned int 的位数组 prime[]。我希望使用这个数组来实现埃拉托斯特尼筛法,让每个位代表一个数字n。也就是说,给定 n,保存与 n 对应的位的数组元素将为 prime[n/32] 并且特定位将位于 n%32 位置。

当数字为素数时(如果其位 == 0),我的 testBitIs0(int n) 函数返回 1,否则返回 0:

return ( (prime[n/32] & (1 << (n%32) )) != 0);  

我的setBit(int n)函数只是将相应位置的位设置为1:

int i = n/32;
int pos = n%32;
unsigned int flag = 1;
flag = flag << pos;
prime[i] = prime[i] | flag;

我遇到的问题是,当我使用素数的倍数调用 setBit 时,我认为它没有正确设置该位。当我下次运行此行时使用素数的倍数(例如数字 2 的 4、6、8 等)调用 setBit 时:

if(testBitIs0(i)) { ... }

使用i = 4/6/8/etc,当它应该返回0时,它仍然会返回1。
有人可以检查我的代码以确保我正确实现吗?谢谢。

最佳答案

这看起来就像你想要的那样。还有一个位数组和一些位旋转函数。

http://bcu.copsewood.net/dsalg/bitwise/bitwise.html

关于c - 使用位数组的埃拉托斯特尼筛法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16084491/

相关文章:

python - 如何在 Python 中表示和使用 n 位向量?

c# - 如何填充 BitArray 以便将其复制到字节

c - 正确处理 TCP 带外数据

c - 严格的别名规则是什么?

c - 如何在 pthread 之间传递变量?

c - 在 C 中设计 eratosthenes 筛时减少内存使用

c - 释放内存的最佳方法是什么?

c++ - 为什么这个 Sieve of Sundaram 实现比这个 Sieve of Eratosthenes 实现快得多?

java - 我的 Java Sieve 代码速度很慢并且无法按预期的时间复杂度进行扩展

python - Python 中小集的性能