ビット演算での考察 [第02局目]
bs = 000 010 000 ws = 010 101 010
// Surface Board sb = bs | ws sb -> 010 111 010
■ 欲しい結果
横 = 000 010 000 縦 = 000 010 000 結果 = 000 010 000
■ 式 (3路盤)
// Horizontal Surface Board hsb = (sb << 1) & (sb >> 1) // Vertical Surface Board vsb = (sb << 3) & (sb >> 3) // remove stones if (黒番) rs = hsb & vsb & ws else rs = hsb & vsb & bs
■ 検証
sb = 010 111 010 // Horizontal Surface Board sb << 1 = 101 110 100 sb >> 1 = 001 011 101
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
3路盤の単純な囲みは取得出来ました。
次は隅の取得方法を考えなければ・・・
最終的には [一手戻る] 機能の為にも取った石の復元方法も同時に考えます。
いちいち取った石を配列で持たせたくないので、bitboardの並列演算なら処理パワーで何とか出来ます!
またオセロの bitboard を参考にしようかと思ったら、打った手を記憶する必要があるのとか、マスの数分シフトしてそうなので見るのを飽きられました(詳しく見てません)
19路の囲碁を作るとなると19回シフトするとかナンセンスです。
そこは並列処理として扱いたい(取れる石を数命令で算出出来る意味で並列処理と書いてます)