通过位操作确定扑克手的强度

Determining Poker Hand Strength via Bit Manipulation

我正在关注这个:Optimizing hand-evaluation algorithm for Poker-Monte-Carlo-Simulation

我的设置是相似的——一个无符号长整型来表示棋盘和玩家的持股。所有卡片都是位标志,从 1 开始,到 2^51 结束。

例如2c是1,3c是16,4c是256,As是2^51。所以,手

1010 0000 1001 0000 0000 0100 0000 0001 0000 0000 0010 是

Qs Qd 7h 5c 2d(棋盘)+ Ts Tc(玩家持有)。

我提到的 link 很好地解释了如何找到同花顺/四同花顺,而且它很有效。但是,我似乎在尝试识别其中三种时遇到了障碍。我试过:

如何消除所有少于三个设置位的半字节?

这个问题与Hamming weight的计算密切相关。那就是您对每个半字节的设置位数感兴趣。开始的步骤是:

int64 w = hand - ((hand >> 1) & 0x55555555);
w = (w & 0x33333333) + ((w >> 2) & 0x33333333);

这将得出 w 中每个半字节的设置位数。然后检查 w 的每个半字节是否包含 3。像这样:if ((w & 0xf) == 0x3 || (w & 0xf0) == 0x30 ....