我有以下代码:
(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 值超出范围长期:18446462598732840960 clojure.lang.RT.longCast (RT.java:1134)
该位板是黑色棋子的初始位置。问题是 long 是在 clojure 中签名的(也在 java 中)。我尝试使用 BigInt,但它不允许位操作。
有什么建议么?