2017-02-03 4 views
2

私は1次元Convayのライフゲームプログラムをやろうとしていますが、世代が過ぎるたびにプログラムは余分な数字を生成し続けます。コード:私は、所望の出力がエラー:ビット単位の操作で余分な数字を取得する

10110 
00011 
00110 
10111 
01111 
01011 

編集だろうこの

10110 
10011 
100110 
101111 
1011110 
1001001 

のような出力を取得しています

3 
01011 

(3世代) のような入力で

int generation=IntegerparseInt(in.nextLine().trim()); 
long cells=Long.parseLong(input1, 2); 
for(int i=0;i<generation;i++)//Assume 
{ 
    long newa=cells>>1; 
    long newb=cells<<1; 
    System.out.println(Long.toBinaryString(newb));//For testing purpose 
    cells=newa^newb; 
    System.out.println(Long.toBinaryString(cells));//For testing purpose 
} 

:ちゃんテストコードを銀杏:

for(int i=0;i<generation;i++) 
     { 
      long newa=cells>>1; 
      long newb=cells<<1; 
      System.out.println(Long.toBinaryString(newb)); 
      System.out.println(Long.toBinaryString(newa)); 
      cells=newa^newb; 
      System.out.println(Long.toBinaryString(cells));//For testing purpose 
     } 

出力することである:

10110 
101 
10011 
100110 
1001 
101111 
1011110 
10111 
1001001 

答えて

2

Andrewは言ったように、左シフトは常に余分な数字を生成します。 Conwayの人生のゲームは無限の世界で行われるので、これは実際は正しい実装です。ただし、ユニバースのサイズを制限する場合は、各世代のN個の右端の数字のみを保持する必要があります(Nはユニバースのサイズです)。

this answerに述べたように、inteker KのN右端の桁が動作を得ることができるK&((1<<N)-1)

フル実施例:

public class ConwaysGame { 

    public static void main(String[] args) { 

     int numGenerations = 10; 

     // Size of the "universe" 
     int universeSize = 12; 

     // Initial value 
     long cells = 29; 

     for(int i=0;i<numGenerations;i++) { 

      // Calculate new generation 
      long newa=cells>>1; 
      long newb=cells<<1; 
      cells=newa^newb; 

      // Limit the result to the size of the universe 
      cells = rightMostBits(cells, universeSize); 

      // Output to console 
      System.out.println(
        leftPadZeros(
         Long.toBinaryString(cells), universeSize 
        ) 
       ); 

     } 
    } 

    private static long rightMostBits(long data, int numBits){ 
     // https://stackoverflow.com/questions/2798191/extracting-rightmost-n-bits-of-an-integer 
     return data & ((1<<numBits)-1); 
    } 

    private static String leftPadZeros(String str, int len){ 
     int numzeros = Math.max(len - str.length(), 0); 
     return new String(new char[numzeros]).replace("\0", "0") + str; 
    } 
} 

出力:

000000110100 
000001110010 
000011011101 
000111010100 
001101000010 
011100100101 
110111011000 
110101011100 
110000010110 
111000100111 
1

細胞は0111であると言います。

cells  = 0111 
newa  = 0011 
newb  = 1110 
newa^newb = 1101 

左あなたは、余分な数字が常に滞在する同じ右シフト数でXORを行っているので、常に余分な数字を生成し、番号をシフト:あなたはイテレーションを経て行くときに何が起こるかを見てください。

+0

なぜ初心者くさいなります1000?それは1110ではないでしょうか? – Spano

+0

おっと!あなたは正しいです、私は私の答えを修正しました。しかし、細胞が0でない限り、余分な数字が残っています。 –

+0

特定の数値でキャップする方法はありますか? – Spano

関連する問題