簡體   English   中英

用C語言編寫生活游戲-按位運算問題

[英]Programming Game of Life in C - Issue with bitwise operations

我正在嘗試用C編寫Conway的《生命游戲》,但是我對如何存儲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;
    }
 }

您可以通過對( | )與設置了該位的值進行設置。

您可以使用與運算( & )取消設置某位的值,該值設置了該位以外的所有位。

您可以使用NOT( ~ )運算符將設置為1的值轉換為設置為1的值。

您可以通過“ & ”( & )設置僅設置了該位的值,並判斷結果是true還是false來判斷是否設置了該位。

你可以用第n位的值(從右邊算起,名為第0位最右邊的位)由左移(設置<< )的值1n位。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM