チェックサムの計算を目指した何か
30分プログラム、その749。チェックサムの計算をしようといて失敗しました。
wikipedia:チェックサムによると、チェックサムは「各ワードの合計の下位nビット」の合計として定義されています。
が、これを勘違いして「全ワードの合計の下位nビット」だと思ってコードを書いてしまいました。でも、せっかく書いたので貼っておきます。
SMLでビット演算する方法がわからず結構調べました。ホームページ移転のお知らせ - Yahoo!ジオシティーズによるとWordストラクチャを使えばできるらしいです。
使い方
- checksum 8 [1,2,3]; val it = 0wx6 : word
ソースコード
open Word; infix 6 << andb; fun mask n = (0wx1 << (Word.fromInt n)) - 0wx1; fun add mask (x,y) = (x + y) andb mask; fun checksum bits xs = List.foldl (add (mask bits)) 0wx0 (List.map Word.fromInt xs); (* from wikipedia(ja) *) val test = checksum 8 [ 0x08,0x09,0x0A,0x0B,0x0C, 0x0D,0x0E,0x0F,0x00,0x01, 0x02,0x03,0x04,0x05,0x06, 0x07 ];