我有一个 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。
有人可以检查我的代码以确保我正确实现吗?谢谢。
最佳答案
这看起来就像你想要的那样。还有一个位数组和一些位旋转函数。
关于c - 使用位数组的埃拉托斯特尼筛法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16084491/