ホーム > 未分類 > クチバジムのゴミ箱と戦う 2回戦

クチバジムのゴミ箱と戦う 2回戦

2ndゴミ箱決定ルーチン。「なにがやりたいのかを考えればなんとなくわかる」感じのコードでした。

まず、やりたかったこと。
1. エントリ内の1番目(ゴミ箱候補数)をFFDBに入れる
2. 乱数を作る
3. 1が下限、FFDBにいれていた値が上限となるように乱数を補正する
4. 乱数をeに入れる、dに00を入れる
5. eをデクリメント deは0000から[候補数-1]になる
6. hl(エントリの2番目、つまり2nd候補1を見ている)に16bit足し算をする
7. hlの指しているエントリのゴミ箱を2ndに設定する

うん、まともになりそうだ。

実際のコードはこちら。
1. エントリ内の1番目(ゴミ箱候補数)をFFDBに入れる
2. 乱数を作る
3. FFDBにいれていた値と乱数をandする ←これバグ
4. 乱数をeに入れる、dに00を入れる
4. eをデクリメント
5. hl(該当エントリの2番目、つまり2nd候補1を見ている)に16bit足し算をする 
6. hlの指しているエントリのゴミ箱を2ndに設定する

どうやらゴミ箱のコードを書いた人はand演算を根本的に勘違いしていたようです。
よく「乱数を0-15にキャップする」という用途でand oxoFを使いますが、
そのノリで「0-14にキャップする」ためにand 0x0Eと書いてみたり、
「0-2にキャップする」ために0x03をandしてるのに下限0であることを考慮せずにdecしてみたり、
そういうミスが重なってエントリ内の偶数番目しか読まれなかったり255番目を読みに行ったりすることが多々あります。

さあ、正しいテーブルを作って偏りの調査にはいろうか。

広告
カテゴリー:未分類
  1. 2015年7月26日2:24 AM

    7e65(0) 02 01 03 00 00
    7e6a(1) 03 00 02 04 00
    7e6f(2) 02 01 05 00 00
    7e74(3) 03 00 04 06 00
    7e79(4) 04 01 03 05 07
    7e7e(5) 03 02 04 08 00
    7e83(6) 03 03 07 09 00
    7e88(7) 04 04 06 08 0a
    7e8d(8) 03 05 07 0b 00
    7e92(9) 03 06 0a 0c 00
    7e97(A) 04 07 09 0b 0d
    7e9c(B) 03 08 0a 0e 00
    7ea1(C) 02 09 0d 00 00
    7ea6(D) 03 0a 0c 0e 00
    7eab(E) 02 0b 0d 00 00

    1stが0のとき:乱数はand 02 →取りうる値はFF(1),01(3)
    1stが2のとき:乱数はand 02 →取りうる値はFF(3),01(5)
    1stが4のとき:乱数はand 04 →取りうる値はFF(b),03(7)
    1stが6のとき:乱数はand 03 →取りうる値はFF(7),00(3),01(7),02(9)
    1stが8のとき:乱数はand 03 →取りうる値はFF(a),00(5),01(7),02(b)
    1stがAのとき:乱数はand 04 →取りうる値はFF(5),03(d)
    1stがCのとき:乱数はand 02 →取りうる値はFF(8),01(d)
    1stがEのとき:乱数はand 02 →取りうる値はFF(3),01(d)

  1. No trackbacks yet.

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。