符号拡張がしたい
ABCをパースする際に、24ビットの整数を32ビットの整数に符号拡張したくなった。
とりあえず、算術シフトをつかって実現してみた。7ビットシフトなのは、OCamlの整数が31ビットだから。
let s_extend d = (d lsl 7) asr 7
これでもいいんだけど、CPUによっては符号拡張命令をもっているらしいから、なんかもったいないような気がする。
id:selvaggio方式
http://twitter.com/selvaggio/statuses/950446367で教えてもらった。
let s_extend d = 0x1fe * (0x00800000 land d) lor d