【发布时间】:2013-04-11 15:48:32
【问题描述】:
我有一个位数组 prime[]of unsigned int。我希望通过让每个位代表一个数字n 来使用这个数组来实现一个埃拉托色尼筛。也就是说,给定n,保存与n 对应的位的数组元素将是prime[n/32],并且特定位将在位置n%32。
我的testBitIs0(int n) 函数在数字为素数时返回 1(如果它的位 == 0),否则返回 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。
有人可以检查我的代码以确保我正确实施了吗?谢谢。
【问题讨论】:
-
为什么
testBitIs0检查该位是否不为零? -
请发一个完整的例子...
-
等一下,你说
testBitIs0在数字为素数时返回 1(如果它的位 == 0),但在实现中你比较的是假而不是真。您可以将testBitIs0设为return !(prime[n/32] & (1 << (n%32)))。
标签: c sieve-of-eratosthenes bitarray