「ハッカー」という呼び名は元々犯罪者的な意味はなくて…という話はもう言い古されてきたと思いますが、その元の意味でのハッカーの非常にマニアックな「たのしみ」は、一見複雑な問題をいかにシンプルで美しい手法で解決するか、というところにあるような気がします。そういったテクニック的なものを集めたのが今回ご紹介する書籍、その名も「ハッカーのたのしみ」です。

私がこの本を購入したのはもう10年前のことになりますが、それ以来たびたびリファレンスとして役に立っています。この本ではハッカーの小技が短いC言語のコード片とともにたくさん紹介されていて、それがちょっとした場面で実用的に使うことができるのです。例えば、ある2進数の先頭のゼロの数を数えたいというとき、素直にコードを書けばループとif文とを組み合わせた処理になると思いますが、本書で紹介されているコードは以下のようなものです。

int nlz(unsigned x) {
    int n;

    if (x == 0) return(32);
    n = 1;
    if ((x >> 16) == 0) {n = n +16; x = x <<16;}
    if ((x >> 24) == 0) {n = n + 8; x = x << 8;}
    if ((x >> 28) == 0) {n = n + 4; x = x << 4;}
    if ((x >> 30) == 0) {n = n + 2; x = x << 2;}
    n = n - (x >> 31);
    return n;
}

このコードでは見てわかる通りループが使用されておらず、複雑な演算もないので少ないステップ数で実行することができます。このほかいくつかのバリエーションも紹介されているのですが、そのいずれについてもストレートなものではなく、ちょっとしたどころではない数学的であったりパズル的な思考を必要とするもので、それこそがまさにハッカーの楽しみといえるものなのでしょう。

他にもたくさんの例が掲載されていて、つい最近私が参考にしたのは「ビット逆転」の例です。同僚が愚直に長いコードを書いていたのを見たとき、「あの本に載っていた気がする!」と思いつき、そこに掲載されていたものをもとに、より効率的なコードに差し替えてもらうことにしたのでした。もちろんこのように職業プログラマーにとって実用的に役立つというだけでなく、読み物として楽しむのが本来の役割なのだと思いますが、プログラミングの素養と数学的な思考が必要なので、純粋に楽しめる人は限られているかもしれません。私も数式のところはだいぶ読み飛ばしてしまっていますからね。