0

我有prime[]一些unsigned int. 我希望使用这个数组来实现一个埃拉托色尼筛,让每个位代表一个数字n。也就是说,在给定的情况下n,包含对应的位的数组元素n将是prime[n/32],并且特定位将在位置n%32

testBitIs0(int n)当数字为素数时(如果它的位 == 0), 我的函数返回 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使用多个素数调用时,我认为它设置的位不正确。下次运行此行时,当我setBit使用质数的倍数(例如数字 2 的 4、6、8 等)调用时:

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

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

4

1 回答 1

0

这看起来像你所追求的。还有一个位数组和一些位旋转函数。

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

于 2013-04-18T13:49:52.220 回答