ハッカーのたのしみ
読んだ。
ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか
- 作者: ジュニア,ヘンリー・S.ウォーレン,Jr.,Henry S. Warren,滝沢徹,玉井浩,鈴木貢,赤池英夫,葛毅,藤波順久
- 出版社/メーカー: エスアイビーアクセス
- 発売日: 2004/09
- メディア: 単行本
- 購入: 35人 クリック: 732回
- この商品を含むブログ (129件) を見る
例を一つ。java.math.BigDecimalに、以下の様なコードがある。
if ( (((sum ^ x) & (sum ^ y)) >> 63) == 0L ) // not overflowed
2つのlong変数x, yを加算た後に、結果(sum)がオーバーフローしているかどうかをチェックしているらしいが、パッと見何しているか分からない。
でも、よく考えると理屈が見えてくる。オーバーフローが起きるケースは、x、yの符号が同じで、かつ結果の符号が変わってしまった場合である(x、yの符号が異なる場合はオーバーフローはおきない)。それを簡略化して書いているのだな。*1
このコードにもしっかりと
See "Hacker's Delight" section 2-12
とコメントがついている。由緒正しい本だな。
ほかにも面白い問題がいっぱい。最初はとっつきにくかったけど、読み込むとパズルみたいでハマります。
*1:分かり易く説明すると、「(sumとxの符号bitが異なる)かつ(sumとyの符号bitが異なる)」という式になっている