2016-05-29 4 views
1

私は8ビットの整数を表現する必要があります。私はcharが8ビットであることを知っていますが、私はまだ追加やビットシフトのような操作をどのように実行するのかはわかりません。私はついた:OCamlでバイトを扱う

let (+) x y = Char.chr ((Char.code x + Char.code y) mod 256);; 

これはひどく間違っているようです。

文字を使用してバイトを処理するより良い方法がありますか、またはstdintモジュールのようなものを使用する必要がありますか?

答えて

4

そうですね、だから、ひどく間違っています。 Char.codeはコード(同一性関数)を生成しない関数であり、Char.chrは入力が範囲内にあるかどうかをチェックするだけです。したがって、コードの量はほぼ正しいです。 mod 256を実行しているので、Char.unsafe_chrを使用するとコードサイズをさらに小さくすることができます。

一方、OCamlのメモリモデルはcharintと同じ領域を占めています。だから、あなたはcharを使って多くを節約していません。

実際に8ビットの値が必要な場合は、可能であればそれらのシーケンスを使用したいと思うかもしれません。そのためには、BytesまたはBigarrayのモジュールを使用できます。特に、Bigarrayモジュールでは、バイトを格納することができますが、通常の演算子を使用してそれらをintとして扱います。 (Bigarrayストア操作でmod 256が実行されます。つまり、範囲外の値が切り捨てられます)

関連する問題