我有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。
有人可以检查我的代码以确保我正确地实现它吗?谢谢。