1

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

我的设置是类似的——一个无符号的 long 来代表棋盘和玩家的持股。所有卡片都是位标志,从 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(玩家的持牌)。

我提到的链接很好地解释了如何找到同花顺 / 四同花顺,并且它有效。但是,我似乎在试图识别其中的三个时碰了壁。我试过了:

  • hand & (hand >> 1) & (hand >> 2) & 0x1111111111111111 - 天真的情况,遵循链接中的示例;

  • hand & (hand >> 2) & 0x3333333333333333 -- 这似乎抓住了所有三种,但它错误地将对(例如上面的例子)分类为行程;

  • 及其变体。

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

4

1 回答 1

1

这个问题与计算汉明权重密切相关。也就是说,您对每个半字节的设置位数感兴趣。开始的步骤是:

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

这导致 w 中每个半字节的设置位数。然后,您将检查 w 的每个半字节以包含 3。就像这样:if ((w & 0xf) == 0x3 || (w & 0xf0) == 0x30 ....

于 2017-08-17T06:26:14.713 回答