c - 位数组的问题

标签 c arrays sieve-of-eratosthenes bitarray

我有初始化位数组的宏。在 typeBitVector_t name[0] 中,我存储它的大小,以及我用于埃拉托色尼实际筛选的所有其他内容。这就是为什么我总是将 index/LIMIT 递增 1。这是代码:

typedef unsigned long typeBitVector_t;
#define LIMIT (8*sizeof(unsigned long))
#define createArray(name,size) \
    typeBitVector_t name[1 + size/LIMIT + ((size%LIMIT) != 0)] = {size, 0};    
#define whatSize(name) \
    name[0]
#define setBitValue(name, index, value) \
    (name[(index/LIMIT)+1] = (value)) ? (name[(index/LIMIT)+1] |= (1<<(index%LIMIT))) : (name[(index/LIMIT)+1] &= ~(1<<(index%LIMIT)));
#define returnBitValue(name, index) \
    (name[(index/LIMIT)+1] & (1<<(index%LIMIT))) ? 1 : 0

int main(void)
{
    createArray(myArray,100);
    unsigned long bounds = (unsigned long) sqrt(100);

    for(int i = 2; i <= bounds; i++)
    {
        if((returnBitValue(myArray,i)) == 0)
        {
            for(int j = i; i * j <= bounds; j++)
            {
                setBitValue(myArray, i*j, 1);
                printf("The bit on index %d has the value %d\n", i*j, returnBitValue(myArray, i*j));
            }
        }
    }

    printf("\nTest out of the cycle\nThe bit on index %d has the value %d\n", 8, returnBitValue(myArray, 8));
}

我附上这个程序的输出:

$ ./program
The bit on index 4 has the value 1
The bit on index 6 has the value 1
The bit on index 8 has the value 1
The bit on index 10 has the value 1
The bit on index 9 has the value 1

Test out of the cycle
The bit on index 8 has the value 0

所以筛子在循环中工作“正常”(它现在列出了 2 到 10 之间的每个非质数)但在循环之外它被重置了?问题出在哪里?

最佳答案

returnBitValue(myArray, i*j)

展开为

(name[(i*j/LIMIT)+1] & (1<<(i*j%LIMIT))) ? 1 : 0

这与您可能想要的不同:

(name[((i*j)/LIMIT)+1] & (1<<((i*j)%LIMIT))) ? 1 : 0

因此,至少您需要在宏扩展中的 index 周围添加括号。但如果你尝试做类似的事情,它仍然会崩溃

returnBitValue(myArray, i++)

所以如果可以避免的话,最好不要使用宏(尽管我知道在这种情况下不使用函数似乎是一个特定条件)。

setBitValue 还有一些问题:

(name[((index)/LIMIT)+1] = (value)) ? (... |= ...) : (... &= ...)

你可能是说

name[((index)/LIMIT)+1] = (value) ? (... | ...) : (... & ...)

您还有一个潜在的整数溢出:1 的类型为 int,但您将其视为 long。请改用 1L

关于c - 位数组的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22584916/

相关文章:

c++ - 是否有用于 C(C99 或其他)的标准化和常用库,因为 STL 用于 C++?

c - 未初始化的 malloc 内存在不同环境中的不同行为

c - 按元素添加两个数组

ios - 以编程方式在 plist 文件中添加索引

javascript - 创建小时数组 : 00:00, 01 :00, 02:00

javascript - JavaScript 中的 Eratosthenes 算法的筛法为大量运行无穷无尽

c - 我已经编写了这段代码,但没有得到输出,任何人都可以帮我解决这个问题吗?

javascript - 相对于 jQuery/Js 中的内部数据之一对数组进行排序

c++ - 埃拉托色尼筛的优化

performance - 埃拉托斯特尼筛法与试除时间复杂度