C中的随机位翻转

Random bit flip in C

我正在创建一个简单的程序来更改网格上的位置:

#define R 11
#define C 11
#define N 3

typedef struct {
    uint8_t live :1;
    uint8_t next :1;
    uint8_t padding :6;
} point;

int main() {
    uint8_t r, c;
    point graph[R][C] = {
        {{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}},
        {{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}},
        {{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}},
        {{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}},
        {{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}},
        {{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}},
        {{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}},
        {{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}},
        {{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}},
        {{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}},
        {{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}},
    };
    for(size_t i = 0; i < N; i++) {
        for(r = 0; r < R; r++) {
            for(c = 0; c < C; c++){
                putchar(0x30 + graph[r][c].live);
                graph[r][c].next ^= (graph[(r-1) % R][c].live | graph[(r+1) % R][c].live | graph[r][(c+1) % C].live | graph[r][(c-1) % C].live);
            }
            putchar(0x0a);
        }
        putchar(0x0a);
        for(r = 0; r < R; r++) {
            for(c = 0; c < C; c++) {
                graph[r][c].live = graph[r][c].next;
            }
        }
    }
    return 0;

}

而不是输出预测的模式,(我似乎无法显示它而不让我的问题必须提交很多代码),在第二次迭代之后,图 [0][3] 被翻转到当它应该保持为 0 时为 1。

我认为模运算符 % 搞砸了。参见 Modulo operation with negative numbers

您正在使用 (r - 1) % R 对图表进行索引,当 r 为零时将为负数。

由于索引为负,它可能会从堆栈中更远的地方获取值,可能是 rc.

的值

我会创建一个函数来执行您期望的模运算(上面的 link 中给出了一些示例)并改用它。

您还必须将其转换为有符号类型,因为这将防止溢出将其设置为 255:mod(((int8_t)r)-1, R)。或者将 rc 声明为有符号类型。