7

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

我相信该库使用的底层数据结构只是 OCaml 字符串,我知道它是可变的(并且相对紧凑?我想我读到某处的开销很小......)字节数组,但你不能方便地做由于异或,移位等对字符串的许多按位运算都没有在字符上定义,而仅在整数类型上定义,因此您必须在整数和字符之间来回转换......例如,逻辑左移定义在字符(字节)上:

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 和标准 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

4

1 回答 1

9

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

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

于 2013-04-23T03:39:43.853 回答