【问题标题】:Chess BitBoards in kotlin. Which datatype?kotlin 中的国际象棋 BitBoards。哪种数据类型?
【发布时间】:2020-10-24 04:41:23
【问题描述】:

我认为这个问题还没有被问到。

问题是,在国际象棋中,我们使用位板来加快移动生成周期,方法是用 bit=1 表示位置,用 bit=0 表示其他位置。在国际象棋中,我们有 8*8 个位置。结合现代 CPU,最推荐在无符号 64 位整数中实现这一点。在 c++ 中,我们可以使用无符号的 64 位地址 int64_t 并将其分配为:0b00000000_00000001_00000001_00000001_00000001_00000001_00000001_00000001

然而,我的问题是,我们将如何在 kotlin 中做到这一点。由于 kotlin 继承了 java 数据类型,我们不能有一个无符号的 64 位位板,只有 63 位,这对于国际象棋来说是不够的。例如。

val whiteInit = 0b11111111_11111111_00000000_00000000_00000000_00000000_00000000_00000000L // cant dos this (=>out of range)
val blackInit = 0b00000000_00000000_00000000_00000000_00000000_00000000_11111111_11111111L // this works

我不想让事情变得更糟,并在不同的数组中拆分行,就像我读过几次一样,因为它丑陋并且可能没有那么快。

因此,在“kotlin-stdlib / kotlin / Experimental”中偶然发现了 ULong 数据类型,到目前为止,我所写的内容看起来很有希望。所以,首先感谢您阅读到这里,其次,这是要走的路还是我错过了更好的东西?

【问题讨论】:

    标签: kotlin chess bitboard ulong


    【解决方案1】:

    对于位板,您关心的是 64 位,但不关心解释为数字。所以Long 也可以,除非我遗漏了一些东西(如果为它定义了按位运算,Double 也一样)。或者你可以使用java.util.BitSet,虽然它可能会更慢。

    【讨论】:

    • 理论上,只要(Long :D)你有 64 位你让它运行,我就可以落后。通过调整,我什至可以想象更少。但是,我问你,你会如何写下来: val whiteInit = 0b11111111_11111111_00000000_00000000_00000000_00000000_00000000_00000000L // 不能这样做(=>超出范围)
    • 我能想到的最直接的方法是BigInteger("1111111111111111000000000000000000000000000000000000000000000000", 2).toLong()(导入java.math.BigInteger)。或者分成两部分:(0b11111111_11111111_00000000_00000000L shl 32) + 0b00000000_00000000_00000000_00000000L.
    • 这可能行得通,但它看起来完全让我恼火。我有几百块位板。我会坚持使用 ULong,我不认为他们会摆脱它,而且他们不能从根本上改变太多,它不再适用于我的代码。赞赏!
    猜你喜欢
    • 2022-06-17
    • 2013-05-24
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 2015-05-02
    相关资源
    最近更新 更多