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
为零时将为负数。
由于索引为负,它可能会从堆栈中更远的地方获取值,可能是 r
或 c
.
的值
我会创建一个函数来执行您期望的模运算(上面的 link 中给出了一些示例)并改用它。
您还必须将其转换为有符号类型,因为这将防止溢出将其设置为 255:mod(((int8_t)r)-1, R)
。或者将 r
和 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
为零时将为负数。
由于索引为负,它可能会从堆栈中更远的地方获取值,可能是 r
或 c
.
我会创建一个函数来执行您期望的模运算(上面的 link 中给出了一些示例)并改用它。
您还必须将其转换为有符号类型,因为这将防止溢出将其设置为 255:mod(((int8_t)r)-1, R)
。或者将 r
和 c
声明为有符号类型。