我正在尝试制作一维Convay的生活游戏程序,但是该程序每次通过时都会继续产生额外的数字。码:

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
10011
100110
101111
1011110
1001001


所需的输出将是

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

最佳答案

正如安德鲁所说,向左移动通常会产生一个额外的数字。这实际上是一种正确的实现方式,因为Conway的生活游戏发生在无限的宇宙中。但是,如果要限制Universe的大小,则只需要保留每一代的N个最右边的数字,其中N是您Universe的大小。

this answer中所述,可以通过操作K&((1<<N)-1)获得Inteker K的N个最右边的数字。

完整的工作示例:

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

关于java - 错误:按位运算获得额外的数字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42033105/

10-13 05:34