符号拡張がしたい

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