使用位阵列的Eratosthenes筛子

时间:2013-04-18 13:35:50

标签: c sieve-of-eratosthenes bitarray

我有一个prime[]的数组unsigned int。我希望使用这个数组实现一个Eratosthenes的Sieve,每个位代表一个数字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时,我不认为它能正确设置位。当我使用素数的倍数(例如4号,6号,8号等号码)调用setBit时,下次我运行此行:

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

使用i = 4/6/8/etc时,如果返回0,它仍会返回1 有人可以检查我的代码,以确保我正确实现这一点?感谢。

1 个答案:

答案 0 :(得分:0)

这看起来像是你所追求的。还有一些数组和一些小的功能。

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