gawk の boolean 関数

ぱぱっよ書かせるプログラムの問題からですが、以下のような問題です。

与えられた自然数(0を含む)が2のべき乗数か否か判定し
そのbooleanを返すインターフェイス isAPo2 を作成せよ

コメントを見れば分かるように、既に多くの方が解答されているようです。 さて、gawk には and() 関数が用意されていますが、なかなか使う機会が少なく、しかも例題が少ないのですが、本問題はこの and() 関数を用いるには最適な問題です。

#! /usr/bin/gawk -f
# isapo2.awk
# http://blogs.wankuma.com/mcat/archive/2008/07/17/149236.aspx

BEGIN {

    # case: True
    printf("True : ");
    for (i = 0; i <= 100; i++) {
        if (isAPo2(i) == 1) {
            printf("%d, ", i);
        }
    }
    print "";

    # case: False
    printf("False : ");
    for (i = 0; i <= 100; i++) {
        if (isAPo2(i) == 0) {
            printf("%d, ", i);
        }
    }
    print "";
}

# isAPo2()
# 上記ページのれいさんのアルゴリズムを使っています
function isAPo2(num) {
    if (num <= 0) {
        return 0;
    } else {
        return ! and(num, (num - 1));
    }
}

and() 関数を用いることにより簡単な表現になっています。 これを実行すると以下のようになります。

gawk -f isap02.awk
True : 1, 2, 4, 8, 16, 32, 64,
False : 0, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 20, <snip>

tag_gawk.pngtag_gawk.png