微妙な一日

朝見た夢が悪かったのか。SICP の問題 4.30 がワケワカなのも含め、色んな場面でどハマリだったりします。どうもイケマセン。

その一

Norton Ghost 2003 でリカバリ用のナニを作成しようとしているんですが、バックアップなプロセスにおいて USB2.0 な DVD ライタを PC-DOS が認識しない。4 月頃に同じ機器の構成で thinkpad から吸い上げた時には何の問題も無かったのに何故だ。
結構前から試行錯誤している用件なんですが、どうもデバイスドライバな世界である事が見えてきた。とは言え未だ問題の解決には至っていません。なんとかなればまとめをエントリ予定ですが出口はどこにあるんだろうか。

その二

某社の新入社員向けな宿題が面白そうなんで若いヒトとキャッチボール。ちなみに仕様はざっくり紹介すると

  • char [8] なソレが入力
  • 縦横なビットの数を勘定して偶数なら 0 奇数なら 1 な規則
  • これを使って short なパリティを計算

例えば以下

入力
0x20 : 00100000 : ' '
0x30 : 00110000 : '0'
0x31 : 00110001 : '1'
0x32 : 00110010 : '2'
0x33 : 00110011 : '3'
0x34 : 00110100 : '4'
0x35 : 00110101 : '5'
0x36 : 00110110 : '6'

出力 (short が出てくる)
00010111 10110100 : 0x17b4

出力な short の上位 8 bits はタテの、下位 8 bits はヨコの、という形です。何度かのキャッチボールにより以下の手続きがでっち上がった。

short calc_parity(char * arry) {
    short par = 0;
    int i, j;

    for(i = 0; i < 8; i++) {
        par ^= (unsigned short)arry[i] << 8;
        for(j = 0; j < 8; j++) {
            par ^= ((arry[i] >> j) & 0x1) << (7 - i);
        }
    }

    return par;
}

何とか繰り返し一発で何とかならんか、と。で、無理矢理 i だけの繰り返しをいくつか思い付いてるんですが、結局 8 * 9 = 72 ステップなソレは必要なのかなぁ。ゴルフ苦手です。後はアセンブラなレベルでステップ減らすしかない気もしますが、トンデモな解がありそうな気もします。
てか、8 byte な領域にどーんとマスクかけて bit が 1 なソレの数をざくっと数えるワザをぱっとイメージできぬあたりがバイナリアンになれない所以かも。(何

あまり試験してないんでナニですが、unsigned と signed がとっちらかってるし。