【发布时间】:2015-02-28 20:16:12
【问题描述】:
我有以下代码:
(defn BitScanReverse [^Long bit-board]
(loop [value bit-board r 0]
(cond
(> value 0x00000000FFFFFFFF) (recur (unsigned-bit-shift-right value 32) (+ r 32))
(> value 0x000000000000FFFF) (recur (unsigned-bit-shift-right value 16) (+ r 16))
(> value 0x00000000000000FF) (recur (unsigned-bit-shift-right value 8) (+ r 8))
(> value 0x000000000000000F) (recur (unsigned-bit-shift-right value 4) (+ r 4))
(> value 0x0000000000000003) (recur (unsigned-bit-shift-right value 2) (+ r 2))
(> value 0x0000000000000001) (recur (unsigned-bit-shift-right value 1) (+ r 1))
:else r)))
它返回在位板上找到的最后一位的索引。 问题是当我尝试运行时: (BitScanReverse 18446462598732840960) ;;期望 63。 它给了我: IllegalArgumentException Value out of range for long: 18446462598732840960 clojure.lang.RT.longCast (RT.java:1134)
这个位板是黑棋的初始位置。问题是 long 是在 clojure 中签名的(也在 java 中)。我尝试使用 BigInt,但它不允许位操作。
有什么建议吗?
【问题讨论】:
-
你看过BitSet吗?
-
如果对您有帮助,请接受一个解决方案!
标签: java clojure chess bitboard