2017-08-17 102 views
0

撲克手的力量,我跟隨這名:Optimizing hand-evaluation algorithm for Poker-Monte-Carlo-Simulation確定通過位操作

我的設置是相似的 - 一個unsigned 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(播放器的保持)。

我提到的鏈接很好地解釋瞭如何找到一個同花順/四種類型,它的工作原理。但是,我似乎碰到了一堵磚牆,試圖找出三種。我已經試過:

  • 手&(手>> 1)&(手>> 2)& 0x1111111111111111 - 幼稚情況下,下面的從鏈路的示例;

  • 手&(手>> 2)& 0x3333333333333333 - 這似乎捕獲所有三個種,但它misclassifies對作爲旅行(例如上面的例子);

  • 及其變體。

我該如何解除少於三個設定位的所有半字節?

回答

1

此問題與計算Hamming weight密切相關。那就是你對每個半字節的設定位數感興趣。開始與步驟是:

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

這導致瓦特每個半字節的組的位的數目。然後你會檢查w的每個半字節來包含3.像這樣:if ((w & 0xf) == 0x3 || (w & 0xf0) == 0x30 ...