我有一个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
有人可以检查我的代码,以确保我正确实现这一点?感谢。