通过位操作确定扑克手的强度
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 很好地解释了如何找到同花顺/四同花顺,而且它很有效。但是,我似乎在尝试识别其中三种时遇到了障碍。我试过:
hand & (hand >> 1) & (hand >> 2) & 0x1111111111111111 -- 天真的案例,遵循 link;
hand & (hand >> 2) & 0x3333333333333333 -- 这似乎抓住了所有三种类型,但它错误地将对(例如上面的示例)分类为旅行;
- 及其变体。
如何消除所有少于三个设置位的半字节?
这个问题与Hamming weight的计算密切相关。那就是您对每个半字节的设置位数感兴趣。开始的步骤是:
int64 w = hand - ((hand >> 1) & 0x55555555);
w = (w & 0x33333333) + ((w >> 2) & 0x33333333);
这将得出 w 中每个半字节的设置位数。然后检查 w 的每个半字节是否包含 3。像这样:if ((w & 0xf) == 0x3 || (w & 0xf0) == 0x30 ...
.
我正在关注这个: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 很好地解释了如何找到同花顺/四同花顺,而且它很有效。但是,我似乎在尝试识别其中三种时遇到了障碍。我试过:
hand & (hand >> 1) & (hand >> 2) & 0x1111111111111111 -- 天真的案例,遵循 link;
hand & (hand >> 2) & 0x3333333333333333 -- 这似乎抓住了所有三种类型,但它错误地将对(例如上面的示例)分类为旅行;
- 及其变体。
如何消除所有少于三个设置位的半字节?
这个问题与Hamming weight的计算密切相关。那就是您对每个半字节的设置位数感兴趣。开始的步骤是:
int64 w = hand - ((hand >> 1) & 0x55555555);
w = (w & 0x33333333) + ((w >> 2) & 0x33333333);
这将得出 w 中每个半字节的设置位数。然后检查 w 的每个半字节是否包含 3。像这样:if ((w & 0xf) == 0x3 || (w & 0xf0) == 0x30 ...
.