ビット演算での考察 [第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
                                        • -
AND = 001 010 100 // Vertical Surface Board sb << 3 = 111 010 000 sb >> 3 = 000 010 111
                                        • -
AND = 000 010 000 // remove stones hsb = 001 010 100 vsb = 000 010 000
                                        • -
AND = 000 010 000 // remove black stone hsb & vsb = 000 010 000 bs = 000 010 000
                                              • -
AND = 000 010 000 // remove white stone hsb & vsb = 000 010 000 ws = 010 101 010
                                              • -
AND = 000 000 000


3路盤の単純な囲みは取得出来ました。
次は隅の取得方法を考えなければ・・・
最終的には [一手戻る] 機能の為にも取った石の復元方法も同時に考えます。

いちいち取った石を配列で持たせたくないので、bitboardの並列演算なら処理パワーで何とか出来ます!
またオセロの bitboard を参考にしようかと思ったら、打った手を記憶する必要があるのとか、マスの数分シフトしてそうなので見るのを飽きられました(詳しく見てません)

19路の囲碁を作るとなると19回シフトするとかナンセンスです。
そこは並列処理として扱いたい(取れる石を数命令で算出出来る意味で並列処理と書いてます)