OCaml中的按位运算

mic*_*kig 5 ocaml bit-manipulation

在OCaml中编写bit-twiddling代码最常用的方法是什么?我知道非常酷的Bitstring库,虽然这是在某些协议中解析二进制数据的好方法,但它不支持像xor或移位这样的按位运算.

我相信该库使用的底层数据结构只是OCaml字符串,我知道这些字符串是可变的(并且相对紧凑?我想我读过那里的开销很少......)字节数组,但是你不能方便地做字符串作为字节数组的许多按位操作,因为xor,移位等没有在字符上定义,而只在整数类型上定义,所以你必须在int和chars之间来回转换...例如,逻辑移位左定义on chars(bytes):

let byte_lsl (x : char) (n : int) : char =
    Char.chr (255 land (Char.code x lsl n))

# byte_lsl '\x0f' 1 ;;
- : char = '\030'
Run Code Online (Sandbox Code Playgroud)

这是我们能做的最好的吗?

据推测,如果编译器没有将字符打包成机器字,这实际上并不是低效的,并且与Java中的情况大致相同......但是Haskell和Standard ML都提供了较小的无符号整数类型,从而产生了更清晰的代码, 恕我直言.

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

Jef*_*eld 8

如果您想要有效地打包很多位,可以考虑使用该Bigarray库.

我也认为使用字符串会很好.额外的功能Char.code,Char.chr实际上不生成任何代码.它们只是使用新类型重新解释数据.使用字符串的唯一问题(我能想到的)是32位模型中字符串大小的限制相当小.我自己已经达到了这个限制几次.