写入bit-twiddling代码的最惯用方法是什么? OCaml的?我知道非常酷的Bitstring库,但是 虽然这是解析某些协议中二进制数据的好方法, 它不支持xor或shift等按位运算。
我相信该库使用的基础数据结构是 只是OCaml字符串,我知道它是可变的(相对而言) 紧凑?我想我读的是开销很小 某处...)字节数组,但你不能方便地做很多 自xor以来,字符串作为字节数组的按位运算,移位 等等不是在字符上定义,而是仅在整数上定义 类型,所以你必须在int和之间来回转换 chars ...例如,左边定义的逻辑移位 字符(字节):
let byte_lsl (x : char) (n : int) : char =
Char.chr (255 land (Char.code x lsl n))
# byte_lsl '\x0f' 1 ;;
- : char = '\030'
这是我们能做的最好的吗?
据推测,如果编译器没有将字符包装到机器字中,这实际上并不是低效的,并且与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
答案 0 :(得分:8)
如果您想要有效地打包很多位,可以考虑使用Bigarray
库。
我也认为使用字符串会很好。额外函数Char.code
和Char.chr
实际上不会生成任何代码。它们只是使用新类型重新解释数据。使用字符串的唯一问题(我能想到的)是32位模型中字符串大小的限制相当小。我自己已经达到了这个限制几次。