2017-02-03 4 views
2

1 차원 Convay의 게임 라이프 프로그램을 시도하고 있지만 세대가 지나갈 때마다 프로그램에서 계속 추가 숫자를 생성합니다. 코드 :이Error : 비트 단위 연산으로 여분의 숫자 받기

10110 
10011 
100110 
101111 
1011110 
1001001 

같은

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 
} 

으로 입력

3 
01011 

(3 세대)

같은 나는 점점 오전 출력은 원하는 출력이 될 것

10110 
00011 
00110 
10111 
01111 
01011 

편집 : 찬 후 에 테스트 코드를 드래그하는 :

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의 N의 가장 오른쪽 숫자는 K가 작동을 얻을 수있다 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입니다. 같은 권리를 가진 XOR을하고 있기 때문에

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

왼쪽 여분의 자리가 항상 남아있을 것입니다 수를 이동 숫자는 항상 여분의 자리를 생산 이동과 : 당신은 반복을 통해 갈 때 어떻게되는지 봐.

+0

이유 newb 것 1000일까요? 1110 년이 아니겠습니까? – Spano

+0

웁스! 당신 말이 맞아요, 제 대답을 바로 잡았습니다. 그러나 셀이 0이 아니면 여분의 숫자가 계속 남아 있습니다. –

+0

특정 숫자로 캡핑 할 수 있습니까? – Spano