【问题标题】:Sieve of Eratosthenes using a bit array使用位数组筛选 Eratosthenes
【发布时间】: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] &amp; (1 &lt;&lt; (n%32)))。

标签: c sieve-of-eratosthenes bitarray


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多