Jaki jest najbardziej idiomatyczny sposób pisania kodu bit-twiddling w OCaml? Wiem o bardzo fajnej bibliotece Bitstring, ale to byłby świetny sposób na sparsowanie danych binarnych w jakimś protokole, nie obsługuje operacji bitowych takich jak xor czy shifting.Bitowe operacje w OCaml
Uważam, że podstawowa struktura danych używana przez tej biblioteki jest tylko ciągi SML, które znam są zmienne (i stosunkowo kompaktowy? Myślę, że czytałem, że istnieje niewiele napowietrznych gdzieś ...) tablice bajtów, ale nie można wygodnie wykonywać wielu bitowych operacji na łańcuchach jako tablic bajtowych, ponieważ xor, przesunięcia itd. nie są zdefiniowane na znakach, ale tylko na typach całkowitych , więc trzeba rzutować iz powrotem między ints a znaki ... na przykład, przesunięcie logiczne w lewo zdefiniowane na znaków (bajty):
let byte_lsl (x : char) (n : int) : char =
Char.chr (255 land (Char.code x lsl n))
# byte_lsl '\x0f' 1 ;;
- : char = '\030'
Czy to jest najlepsze, co możemy zrobić?
Prawdopodobnie jeśli kompilator nie zapisuje znaków w słowach maszynowych, nie jest to faktycznie nieefektywne i jest prawie takie samo jak sytuacja w Javie ... ale zarówno Haskell, jak i Standard ML zapewniają mniejsze liczby całkowite bez znaku, co daje wyniki w znacznie jaśniejszym kodzie, 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
Nie natknąłem się na tę bibliotekę w moich poszukiwaniach, przyjrzę się ... i dziękuję za potwierdzenie moich podejrzeń co do 'Code.chr' i' .code'! – spacemanaki