数独パズルの行、列、およびブロックで使用されている数字を表す 3 つのビット ベクトルを 1 ~ 9 の位置から取得する関数を作成しようとしています。セルは未使用の数字のみを使用でき、関数は、すべてのベクトルの数字が 1 つの可能性を強制するか、複数の可能性があるかを返すことになっています。これは、3 つのベクトルすべてをマージし、結果のパターンのどこに「未設定」のビットがあるかを判断する必要があることを意味すると解釈しました。
ただし、この派生に触発されたにもかかわらず、私の関数は gdb で正しいマスクを返すようには見えません: http://graphics.stanford.edu/~seander/bithacks.html#MaskedMerge
2 つのうち 1 つのセットをマージし、次に 3 つ目のセットを前のマージにマージし、最終的なマージで 1 の数を導出し、それを差し引いて 0 の数を導出しようとしています。
次に、次の関数を書きました。
bool possibilities(unsigned short row, unsigned short col, unsigned short bloc)
{
unsigned int mask = (1 << col) - 1;
unsigned int inbw = (row & ~mask) | (col & mask);
unsigned int mask2 = (1 << bloc) - 1;
unsigned int final = (inbw & ~mask2) | (bloc & mask2);
int num_1s;
while (result != 0) {
result &= (result - 1);
num_1s++;
}
int zeroes = 32 - num_1s; // 32 being the presumed number of bits in a short.
if (zeroes == 1) return true;
return false;
}