我正在尝试用C语编写康威的生命游戏,但我对如何存储ALIVE或DEAD单元格感到难过。
电路板存储在32个无符号长整数(32x32电路板)的数组中,每个位代表一个单元(1 =有效,0 =无效)。我无法改变这种设计。
到目前为止,我有代码确定特定单元格有多少邻居,但我需要根据游戏规则更改其状态(1可能需要变为0或1,0可能需要为1或0)。
我假设我可以使用按位运算(|,&,^)但我不知道如何隔离行中的特定位并存储它,因为我遍历行的其余部分然后存储新的,重新计算行作为一个无符号长。
即。如果10011 ... 0需要01101 ... 1。我怎么能这样做?
我意识到代码需要额外的for循环,但我只是想在继续之前解决这个特定的问题。
感谢任何帮助。
#include <stdio.h>
#include <stdlib.h>
unsigned long columnMask;
int compass = 0;
int totAliveNeighbors = 0;
int iterator = 0;
int iterator2 = 0;
#define ARRAY_SIZE 32
#define NEIGHBORS 8
unsigned long grid[ARRAY_SIZE];
unsigned long copyGrid[ARRAY_SIZE];
unsigned long neighbors[NEIGHBORS];
unsigned long init32;
unsigned long holder = 0;
int main(void){
srand(time(NULL));
printf("\n");
/** Seeds the grid with random numbers **/
for(iterator = 0; iterator < 32; iterator++){
init32 = ((double)rand()/RAND_MAX)*0xFFFFFFFF;
grid[iterator] = init32;
}
/** Displays the binary representation of the grid elements **/
for(iterator = 0; iterator < 32; iterator++){
displayBinary(grid[iterator]);
printf("\n");
}
printf("\n");
/** Calculate and sum neighbors for 'x' cell **/
/** Will need to iterate through each column by shifting the mask **/
/** Will need to iterate through each row **/
iterator= 0; //example use
neighbors[0] = north(iterator);
neighbors[1] = south(iterator);
neighbors[2] = east(iterator);
neighbors[3] = west(iterator);
neighbors[4] = northWest(iterator);
neighbors[5] = northEast(iterator);
neighbors[6] = southWest(iterator);
neighbors[7] = SouthEast(iterator);
columnMask = 0x80000000//need to shift by iterator value later on
for(compass =0; compass < 8; compass++){
totAliveNeighbors += ((columnMask & neighbors[compass])?1:0);
}
}//end main
void displayBinary(unsigned long x){
unsigned long MASK = 0x80000000;
do {
//printf("%c",(x & MASK)?'X':0x20);
printf("%s", (x & MASK)?"1":"0");
} while ((MASK >>=1)!=0);
}
unsigned long north(int rowNum){
if(rowNum == 0){
return 0;
}
else
return grid[rowNum-1];
}
unsigned long west(int rowNum){
holder = grid[rowNum] >>1;
return holder;
}
unsigned long east(int rowNum){
holder = grid[rowNum] <<1;
return holder;
}
unsigned long south(int rowNum){
if(rowNum == 31)
return 0;
else
return grid[rowNum+1];
}
unsigned long northWest(int rowNum){
if(rowNum == 0)
return 0;
else{
holder = grid[rowNum-1] >>1;
return holder;
}
}
unsigned long northEast(int rowNum){
if(rowNum == 0)
return 0;
else{
holder = grid[rowNum-1] <<1;
return holder;
}
}
unsigned long southWest(int rowNum){
if(rowNum == 31)
return 0;
else{
holder = grid[rowNum+1] >>1;
return holder;
}
}
unsigned long SouthEast(int rowNum){
if(rowNum == 31)
return 0;
else{
holder = grid[rowNum+1] <<1;
return holder;
}
}
答案 0 :(得分:5)
您可以通过ORing(|
)设置一个具有该位设置值的位。
您可以通过ANDing(&
)取消设置一个值,该值的每个位都设置为,除了那个。
您可以将具有一位设置的值转换为除了使用NOT(~
)运算符设置的每个位之外的值。
您可以通过ANDing(&
)设置一个位,该值只设置了该位,并查看结果是真还是假。
您可以通过左移(<<
)值1
来设置第n位(从右边开始计数,最右边的位为第0位)的值n 地方。