Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 连接四位板_C++_Bit Manipulation - Fatal编程技术网

C++ 连接四位板

C++ 连接四位板,c++,bit-manipulation,C++,Bit Manipulation,在文章中,有一个非常有趣的建议,就是使用位板测试connect four wins 董事会的结构如下: 6 14 22 30 38 46 54 5 13 21 29 37 45 53 4 12 20 28 36 44 52 3 11 19 27 35 43 51 2 10 18 26 34 42 50 1 9 17 25 33 41 49 0 8 16 24 32 40 48 他们还推荐以下算法,用于测试仅使用8个班次的win: bool haswon(int64_t board) {

在文章中,有一个非常有趣的建议,就是使用位板测试connect four wins

董事会的结构如下:

6 14 22 30 38 46 54
5 13 21 29 37 45 53
4 12 20 28 36 44 52
3 11 19 27 35 43 51
2 10 18 26 34 42 50
1  9 17 25 33 41 49
0  8 16 24 32 40 48
他们还推荐以下算法,用于测试仅使用8个班次的win:

bool haswon(int64_t board)
{
    int64_t y = board & (board >> 7);
    if (y & (y >> 2 * 7)) // check \ diagonal
        return true;
    y = board & (board >> 8);
    if (y & (y >> 2 * 8)) // check horizontal -
        return true;
    y = board & (board >> 9);
    if (y & (y >> 2 * 9)) // check / diagonal
        return true;
    y = board & (board >> 1);
    if (y & (y >> 2))     // check vertical |
        return true;
    return false;
}
我想在我正在编写的类似程序中实现这个算法。然而,要应用我的启发式函数,我需要能够知道给定行中有多少个片段。我真的一直在想这个算法,但我不知道如何检查一行中是否只有1、2或3个片段


现在,我只是对每一行进行迭代,并计算位,但我相信一定有更好的方法使用移位。

对于第0行,您可以通过执行以下操作来获得片段数:

int64_t row0 = board & 0x01010101010101LL;
row0 += row0 >> 32;
row0 += row0 >> 16;
row0 += row0 >> 8;
return row0 & 0xff;
其他行也是如此(先按行号移位)。事实上,您可能一次做两行,因为计数总是适合3位

int64_t x = board & 0x11111111111111LL;
x += x >> 32;
x += x >> 16;
x += x >> 8;
int row0 = x & 0xf;
int row4 = (x >> 4) & 0xf;

对于第0行,您可以通过执行以下操作获得工件数:

int64_t row0 = board & 0x01010101010101LL;
row0 += row0 >> 32;
row0 += row0 >> 16;
row0 += row0 >> 8;
return row0 & 0xff;
其他行也是如此(先按行号移位)。事实上,您可能一次做两行,因为计数总是适合3位

int64_t x = board & 0x11111111111111LL;
x += x >> 32;
x += x >> 16;
x += x >> 8;
int row0 = x & 0xf;
int row4 = (x >> 4) & 0xf;

这就成功了,非常感谢。如果不太麻烦的话,你认为你可以分享你处理类似问题的技巧吗?你是从一个例子开始,然后试着在纸上写出来吗?这是一个非常标准的并行的事情。查看大量标准的比特旋转。这就成功了,非常感谢。如果不太麻烦的话,你认为你可以分享你处理类似问题的技巧吗?你是从一个例子开始,然后试着在纸上写出来吗?这是一个非常标准的并行的事情。查看大量的标准位旋转。