No hay ninguna razón por la que no pueda usar una escalera. El problema, como ha notado, es que java (y por lo tanto, clojure) long está firmado, permitiendo solo 63 bits para números positivos
Java, de forma predeterminada, permite el desbordamiento aritmético sin error. Clojure, de forma predeterminada, no permite el desbordamiento aritmético sin error (consulte *unchecked-math* indicador). Agrega verificación adicional alrededor de operaciones aritméticas y conversiones, por lo que, por ejemplo, (byte 128)
causará una excepción. Desde v1.3.0 clojure hay funciones como (unchecked-byte)
que es equivalente a la funcionalidad java ....
(unchecked-byte 128)
;=> -128 ; 2s-complement of 10000000
(unchecked-byte 2r10000001)
;=> -127 ; 2s-complement of 10000001
Hay toda una serie de operaciones unchecked-*
disponibles (see clojuredocs).
Si usa una recta y las operaciones unchecked-*
, la mayoría de las veces está allí, y luego puede usar las operaciones bit-*
para doblar/verificar bits.
Finalmente el almacenamiento de su tablero de ajedrez en un átomo tiene sentido, y luego actualizarlo con (swap! chessboard fn args)
(llamadas actualizados 15/02/13 con un poco más de intercambio idiomático!)
por ejemplo,
(inc Long/MAX_VALUE) ; java.lang.ArithmeticException
(unchecked-inc Long/MAX_VALUE) ; wraps.
-9223372036854775808
(def chessboard (atom 0))
@chessboard
;=> 0
(bit-test @chessboard 1)
;=> false
(swap! chessboard bit-flip 1)
;=> 2
(bit-test @chessboard 1)
;=> true
@chessboard
;=> 2
(reset! chessboard 0)
;=> 0
(swap! chessboard bit-flip 63)
;=> -9223372036854775808
(bit-test @chessboard 63)
;=> true
'la mejor manera' - muestre su código en http://codereview.stackexchange.com/; 'Como debería' - no constructivo. ¿Qué código tienes? ¿Cuáles son sus requisitos? ¿Dónde estás atrapado? – sehe
@sehe He intentado usar java.lang.Long pero tuve problemas con parseLong() y "10000 ... x63" - 1x10^63) Además, no estoy seguro de si puedo acceder al bit en un momento específico ¿índice? Estoy pidiendo sugerencias e ideas racionalizadas, no necesariamente absolutas. – DanS
Debe editar estos detalles en su pregunta. – sehe