c++ - 连接四个位板

标签 c++ bit-manipulation

this帖子中,有一个非常有趣的建议,用于使用位板测试连接四场胜利。

董事会的结构如下:

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 个类次来测试胜利:

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;
}

我想在我正在编写的类似程序中实现这个算法。然而,为了应用我的启发式函数,我需要能够知道给定行中有多少 block 。我真的一直在尝试理解这个算法,但我不知道如何检查连续是否只有 1、2 或 3 block 。

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

最佳答案

对于第 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;

关于c++ - 连接四个位板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13327748/

相关文章:

c++ - 通过单击垂直标题获取 QTableWidget 的行索引?

c++ - "Bad"GCC优化性能

C++ 传递动态方法指针作为不同类的方法参数

c++ - 使用字符串形成 HTTP 响应

c - 按位移位字符数组

java - 它在位运算中代表什么?

c++ - 为什么文件命令声明该可执行文件包含 "debug_info"

Mysql:用键对字符串进行异或

c++ - C/C++ 中单个参数(函数)中的多个参数

c - 乘以 5/8 并观察溢出