4

我决定编写一个素数生成器作为一个简单的练习。代码非常简单:

static void generatePrimes (long min, long max)
    {

        bool[] prime = new bool[max + 1];

        for (long i=2; i<max+1; i++)
            prime [i] = true;

        for (long i=2; i<max+1; i++) {
            if (prime [i]) {
                if (i>=min)
                    Console.WriteLine (i);
                for (long j=i*2; j<max+1; j+=i)
                    prime [j] = false;
            }
        }

        Console.WriteLine ();

    }

它适用于像 1..10000 这样的输入。但是,在 max=1000000000 左右,它开始工作非常缓慢;此外,单声道占用大约 1Gb 的内存。对我来说,这似乎有点奇怪: bool[1000000000] 不应该占用 1000000000 位,而不是字节吗?也许我犯了一些愚蠢的错误,我没有看到这使它变得如此无效?

4

2 回答 2

8

计算机可以寻址的最小信息单位是一个字节。因此 abool被存储为一个字节。您将需要特殊代码将 8 个布尔值放在一个字节中。BitArray班级为你做这件事。

于 2012-05-29T16:22:18.330 回答
4

没有。与 C++ 的相反vector<bool>,在 C# 中bool,数组是bools.

如果您希望打包您的值(每个布尔值 8 位),请使用 aBitArray代替。

于 2012-05-29T16:22:05.960 回答