在 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