gpt4 book ai didi

java - 错误 : Getting an extra digit in bitwise operation

转载 作者:行者123 更新时间:2023-11-30 07:56:33 25 4
gpt4 key购买 nike

我正在尝试做一个一维的 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

最佳答案

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

this answer 中所述,可以通过操作K&((1<<N)-1)获得整数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 - 错误 : Getting an extra digit in bitwise operation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42033105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com