2013-04-23 5 views
5

OCamlにビットツイリングコードを書くのに最も慣用的な方法は何ですか?私は非常に涼しいBitstringライブラリについて知っていますが、 これはいくつかのプロトコルでバイナリデータを解析するのに最適な方法ですが、 xorやシフトのようなビット演算はサポートしていません。OCamlのビット演算

私はバイト配列(...と比較的 コンパクト?私はどこかにわずかなオーバーヘッド があることを読んだと思う)そのライブラリが使用する基礎となるデータ構造は、私は変更可能です知っている だけOCamlの文字列であると信じて、 バイト単位の操作は、xor、shifts、 などが文字に定義されていないため、整数型の 型でのみ定義されているため、バイト配列として多くの操作を行うことはできません。したがって、intと chars ...例えば、論理シフトleftに定義されています 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' 

これが最善の方法ですか?

コンパイラが機械語にcharsを既にパックしていない場合、これは実際には効率的ではなく、Javaの状況とほぼ同じですが、HaskellとStandard MLは両方とも、はるかに明確なコードで、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

答えて

8

あなたが効率的にパックしたいビットの多くを持っている場合は、Bigarrayライブラリを使用することを検討してください可能性があります。

また、文字列を使用するとうまくいくと思います。余分な機能Char.codeChar.chrは実際にコードを生成しません。彼らは、データを新しいタイプで再解釈させるだけです。文字列で唯一の問題(私が考えることができる)は、32ビットモデルの文字列サイズにはかなり小さな制限があることです。私はこの制限を自分で数回打った。

+0

私は検索でそのlibを見つけたことはありませんでした。私は見ていきます。そして、Code.chrと '.code'に関する私の疑惑を確認してくれてありがとう! – spacemanaki