Qual è il modo più idiomatico per scrivere codice bit-twiddling in OCaml? Conosco la fantastica libreria Bitstring, ma mentre questo sarebbe un ottimo modo per analizzare i dati binari in alcuni protocolli, non supporta operazioni bit a bit come xor o shifting.Operazioni bit a bit in OCaml
credo che la struttura dei dati di base utilizzato da tale libreria è solo stringhe OCaml, che so sono mutabili (e relativamente compatta ? Penso che ho letto che c'è poco overhead da qualche parte ...) array di byte, ma non è possibile eseguire molte operazioni bit a bit su stringhe come array di byte poiché xor, shift e così via non sono definiti sui caratteri, ma solo sui tipi interi , quindi è necessario eseguire il cast avanti e indietro tra inte e caratteri ... ad esempio, spostamento logico a sinistra definito su caratteri (byte):
let byte_lsl (x : char) (n : int) : char =
Char.chr (255 land (Char.code x lsl n))
# byte_lsl '\x0f' 1 ;;
- : char = '\030'
E 'questo il meglio che possiamo fare?
Presumibilmente, se il compilatore non è imballaggio caratteri in parole macchina già, questo non è in realtà inefficiente ed è più o meno come la situazione in Java ... ma Haskell e ML standard entrambi forniscono più piccoli tipi interi senza segno che si traduce in un codice molto più chiaro, IMHO.
http://www.standardml.org/Basis/word.html#Word8:STR:SPEC
http://www.haskell.org/ghc/docs/latest/html/libraries/base/Data-Word.html#t:Word8
Non avevo inciampato in quella libreria nella mia ricerca, darò un'occhiata ... e grazie per aver confermato i miei sospetti su 'Code.chr' e' .code'! – spacemanaki