概要
リバーシの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)