0
0

More than 3 years have passed since last update.

リバーシbitboard備忘録:全ての着手可能位置に対する処理を行うループ

Posted at

概要

リバーシのbitboardを操作する際に使った処理について、備忘録のつもりで書いていきます。
「コード」「コメント」のセットだけ書きます。
実装例はJavaScriptです。
今回は着手可能位置一つ一つに対して処理をしたい場合のループの書き方です。

コードとコメント

ex.js

var bit;
/* for文におけるiのようなもの, 32bitのうち1か所のみビットが立っている
ex:0b 00000000
      00000000
      00000010
      00000000 */

var pattern0, pattern1;
/* 32bit整数, 着手可能位置にビットが立っているものとする
64bit整数が利用できる環境の場合は変数一つで良い
ex:0b 00000001
      00001000
      00000010
      00011000 */


while (pattern0) {
  bit = pattern0 & -pattern0;
  /* 動作:pattern0の立っているビットのうち、LSBを抽出する
入力例
pattern0:0b 00000001
            00001000
            00000010
            00011000
出力例
bit:     0b 00000001
            00000000
            00000000
            00000000 */

  /* bitで表現されるマスに対して処理を実行
     使用例:ソルバー(完全読みAI)に着手位置として送ると、
     各空きマスの評価値を算出できる*/

  pattern0 &= ~bit;
  /* 動作:pattern0のうち、bitと同じ位置に立っているビットを0にする
     for文におけるインクリメントに相当します
入力例
pattern0:0b 00000001
            00001000
            00000010
            00011000

bit:     0b 00000001
            00000000
            00000000
            00000000 
出力例
pattern0:0b 00000000
            00001000
            00000010
            00011000

*/


}//end of while(pattern0)

while (pattern1) {
  //pattern0と同様の処理を記述する
}//end of while(pattern1)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0