C++ 合并位,然后确定结果有多少个0

C++ 合并位,然后确定结果有多少个0,c++,bit,bitvector,C++,Bit,Bitvector,我正在尝试编写一个函数,它接受三位向量,表示数独游戏中从位置1-9开始的行、列和块中使用的数字。单元格只能使用未使用的数字,函数应该返回所有向量中的数字是否强制一种可能性,或者是否存在多种可能性。我认为这意味着我必须合并所有三个向量,然后确定结果模式中哪里有“未设置”位 但是,我的函数在gdb中似乎没有返回正确的掩码,即使它是受以下派生的启发: 我试图在两个集合中合并一个集合,然后将第三个集合合并到上一个集合中,得出最终合并中1的数量,然后减去它得出0的数量 然后,我编写了以下函数: bo

我正在尝试编写一个函数,它接受三位向量,表示数独游戏中从位置1-9开始的行、列和块中使用的数字。单元格只能使用未使用的数字,函数应该返回所有向量中的数字是否强制一种可能性,或者是否存在多种可能性。我认为这意味着我必须合并所有三个向量,然后确定结果模式中哪里有“未设置”位

但是,我的函数在gdb中似乎没有返回正确的掩码,即使它是受以下派生的启发:

我试图在两个集合中合并一个集合,然后将第三个集合合并到上一个集合中,得出最终合并中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;
   }
bool可能性(无符号短行、无符号短列、无符号短团)
{

无符号整数掩码=(1根据本文件:

短字符不小于字符。至少16位。 因此,将零计算为32-num_1可能是错误的

不需要这样做,您可以得到一个无符号的短字符,并将其填充为1,将0设置为前9位

var = 0xFFFFFE00
这样可以避免解决方案强烈依赖于所使用变量的大小

该问题的解决方案可能是这样的(假设上述行、列和集团):


如果我正确理解了
、和
(sic)中的每一个都是位掩码,其各自的位(可能是位0-8)表示数字1-9的存在,那么您的掩码是错误的(实际上是毫无意义的)。例如,如果
设置了位8,则
掩码=(1在第二个选项中,为什么使用0x1FF作为掩码?将这些值移到正确的位置(例如9)是什么意思?@marchon
0x1FF
是设置了最低9位的掩码(
0b111111111
).通过移动到所示位置,我的意思是,例如,从
中获取位0-8,从
中获取位9-17,从
中获取位18-26。
possibilities = row | col | bloc;
while (possibilities != 0) {
     num_0s += ((~possibilities)&1);
     possibilities = (possibilities >> 1);
}
const unsigned int mask = 0x1FF;
unsigned int final = (col & mask) | ((row & mask) << 9) | ((bloc & mask) << 18);