Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 旋转位板_Java_Bitboard - Fatal编程技术网

Java 旋转位板

Java 旋转位板,java,bitboard,Java,Bitboard,我正在使用Java中的24位比特板,表示以下形式的游戏板: 00 01 02 03 04 05 06 07 08 09 10 11 XX 12 13 14 15 16 17 18 19 20 21 22 23 注意板上有一个孔,中间用“XX”表示。我已经生成了一个合法的比特板列表,但是由于该比特板具有正方形的对称性,我可以扔掉大量的比特板,这些比特板已经由列表中的对称表代表 为了检查这些对称性,我需要能够将电路板旋转90度、180度和270度,并在水平、垂直和对角(在两条对角线上)镜像的功能。

我正在使用Java中的24位比特板,表示以下形式的游戏板:

00 01 02 03 04
05 06 07 08 09
10 11 XX 12 13
14 15 16 17 18
19 20 21 22 23
注意板上有一个孔,中间用“XX”表示。我已经生成了一个合法的比特板列表,但是由于该比特板具有正方形的对称性,我可以扔掉大量的比特板,这些比特板已经由列表中的对称表代表

为了检查这些对称性,我需要能够将电路板旋转90度、180度和270度,并在水平、垂直和对角(在两条对角线上)镜像的功能。很明显,我想使用位运算,但这就是我遇到的问题。我已经找到了一些关于如何在国际象棋棋盘上做到这一点的信息,但我无法理解这个概念——更不用说如何将它应用到我自己的棋盘上了


有人能给我演示一下如何高效地旋转/镜像比特板吗?

直到我读到这个问题,我才发现比特板。有趣的概念

我不知道你是否误解了什么。我怀疑您不会根据其拓扑结构动态生成位板的旋转算法,我希望您硬编码旋转算法

因此,我将旋转编码为:

00 -> 04
01 -> 09
02 -> 13
03 -> 18
04 -> 23
...
然后,您可以在方法/例程中对此进行编码,该方法/例程将位板作为参数,执行转换并返回结果。您可能会发现一些转换可以使用二进制逻辑运算符进行编码,但这应该作为算法的优化,而不是一个基本概念

有一个很好的使用比特板的例子,一位知识渊博的开发人员正在讨论跳棋游戏中比特板的使用

或者,您可以选择不同的表示形式,例如:

00 10 20 30 40
01 11 21 31 41
02 12 XX 32 42
03 13 23 33 43
04 14 24 34 44
翻转和旋转的变换显然要简单得多,位的使用也非常合理


您选择的表示方式实际上取决于您计划在游戏中进行的移动类型,以及哪些移动应该易于计算。

我在这里找到了最有效的方法汇编:

例如,64位电路板的垂直翻转只有13个操作,并且没有任何if语句。旋转可以通过翻转和镜像的组合来完成


这些算法中的一些在你第一次看到它们时看起来很神奇。要真正理解它们,在每次操作后转储电路板的状态是很有帮助的。

可能的重复我特别想寻找一种方法,通过位操作来有效地做到这一点,从而最大限度地减少大量计算所需的CPU。