Java 错误:在按位操作中获取额外数字

Java 错误:在按位操作中获取额外数字,java,bit-manipulation,bitwise-operators,Java,Bit Manipulation,Bitwise Operators,我正试图做一个一维的康维生命游戏程序,但每次过了一代,这个程序都会继续生成一个额外的数字。代码: 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; S

我正试图做一个一维的康维生命游戏程序,但每次过了一代,这个程序都会继续生成一个额外的数字。代码:

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
}
(三代) 我得到这样的输出

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
       }

假设单元格为
0111
。看看在进行迭代时会发生什么:

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

左移一个数字总是产生一个额外的数字,因为你用相同的右移数字进行异或运算,额外的数字将一直保留。

正如安德鲁所说,左移总是产生一个额外的数字。这实际上是一个正确的实现,因为康威的生命游戏发生在一个无限的宇宙中。然而,如果你想限制宇宙的大小,你只需要保留每一代最右边的N个数字,其中N是你宇宙的大小


如中所述,整数K的N个最右边的数字可以通过运算
K&((1为什么newb是1000?不是1110?哎哟!你说得对,我更正了我的答案。但是仍然会有一个额外的数字,除非单元格是0。是否有办法将其限制在某个数字?是的,模(
%
)运算符。如果您想将数字上限设置为4位,则可以修改
10000
10001%10000==0001
10110
101
10011
100110
1001
101111
1011110
10111
1001001
cells       = 0111
newa        = 0011
newb        = 1110
newa ^ newb = 1101
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;
    }
}