⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠
Text Elements
Texas Hold’Em Calculations
From the research I have seen online, it seems that binary representation is the way to go.
{A,2,3,4,5,6,7,8,9,“10”,J,Q,K,A} = 14 elements < 2^4 = 16
In the implementation, you will see we use 64-bit integers instead of 56-bit integers, since they are more commonly used, but the first 8-bits will always be 0s.
There are 52^7 possible card combinations, which is a lot… (actually, it’s 52 * 51 * 50 * … 45 which is approx 52^7)
52 < 2^6 = 64, so 52^7 < (2^6)^7 = 2^42
00100011
Suits
Rank
Suits
Brain Dump
“0000000000000000000000000000000000000000000000000”
56-bit Integer
Some Sources of Inspiration:
AC
AD
AH
AS
2C
2D
2H
2S
3C
3D
3H
…
“Ace of Clubs”
…
QD
QH
QS
3S
AC
AD
AH
AS
KC
KD
KH
KS
QC
Some interesting options:
- Use a 56-bit integer, where each bit represents a particular card (such as 2 of Diamonds). If you have 7 cards, you have 7 bits that will be turned on in this 64-bit integer.
- Represent each card as an 8-bit integer, and have a long row of them?
1 - Royal Flush
This is the best hand in poker. We must have the 5 highest cards (10, J, Q, K and A), all with the same suits. To determine if our hand has a royal flush, we must ignore the first 9 ranks, so we shift our representation by 9 ranks * 4 bits/rank = 36 bits.
royal_flush = (h >> 36) & (h >> 40) & (h >> 44) & (h >> 48) & (h >> 52)
→ Returns a 4-bit integer, ex: “0010”. If it is non-zero, then you have a royal flush. The bit will represent the suit of the royal flush.
Case for tie: If both players have a royal flush, they automatically tie the pot.
“3”s
“2”s
“A”s
*Duplicate Aces to facilitate calculation of straights and comparing certain hand strengths
2 - Straight Flush
Straight flush means 5 cards of the same suit are next to each other.
hh = (h) & (h >> 4) & (h >> 8) & (h >> 12) & (h >> 16).
→ Returns a 40-bit integer. If hh
is non-zero, then you have a straight flush.
Case for tie: If both players have a straight flush, then the winner is the one with the left-most “1” bit. Both players tie if their left-most “1” bit is in the same position.
3 - Four of a Kind
Example: Four of a Kind for 3s
0000…00010000
→ Returns a 49-bit integer. If hh
is non-zero, then you have a four of a kind.
Case for tie: If both players have a four of a kind, the player with the left-most 1-bit wins. If tie, check for kicker.
14 “1”s in hex
This is a bitmask, which we apply to make sure the groupings of “1”s are only every 4th positions.
4 - Full House
A Full House can be checked by checking for 3 of a kind and pair.
Case for tie: Check the next highest card. Only split pot if you’ve reached the 5th card and they still tie.
10 - High Card
5 - Flush
For a flush, we check that there are at least 5 cards which have the same suit. We have 4 possible suits:
Clubs Flush → “0001”. Apply a mask of “0x111…1” Diamonds Flush → “0010”. Apply a mask of “0x222…2” Hearts Flush → “0100”. Apply a mask of “0x444…4” Spades Flush → “1000”. Apply a mask of “0x888…8”
For each of the masks, after applying the mask, we count the number of 1 bits. Ignore the last 4 bits because we don’t want duplicate Aces.
for mask in masks: hh = (h) & mask hh = hh >> 4 if countones(hh) >= 5: return hh
Case for tie: If both players have a flush, check for the ranks of the cards. *TODO
→ returns a 52-bit integer. If hh
has more than 5 1-bits, it is a flush.
→ Return the original 56-bit hand representation
6 - Straight
A straight is anywhere we have a sequence of 5 consecutive ranks of cards. Since we don’t care about suits, we will first “activate” (make to a 1) all other cards where we have a card with the same suit.
hh1 = (h) & (0x111…1) hh1 = (hh1) | (hh1 << 1) | (hh1 << 2) | (hh1 << 3)
Case for tie: If both players have a straight, the winner is the one with the highest straight card value (i.e. the left most “1” bit).
0001
hh2 = (h) & (0x222…2) hh2 = (hh2) | (hh2 >> 1) | (hh2 << 1) | (hh2 << 2)
hh4 = (h) & (0x444…4) hh4 = (hh4) | (hh4 << 1) | (hh4 >> 1) | (hh4 >> 2)
hh8 = (h) & (0x888…8) hh8 = (hh8) | (hh8 >> 1) | (hh8 >> 2) | (hh8 >> 3)
hh = hh1 | hh2 | hh4 | hh8
hh = (hh) & (hh >> 4) & (hh >> 8) & (hh >> 12) & (hh >> 16)
→ Returns a 40-bit integer. If hh
is non-zero, then you have a straight.
7 - Three of a Kind
For three of a kind, we have different permutations in each group that we need to check. We then use an OR for all of these possibilities. The results finds us all three of a kind.
Case for tie: If both players have a three of a kind, find the highest three. If still tie, looking for kickers.
→ Returns a 53-bit integer. If hh
is non-zero, then you have a three of a kind. The “1” will represent the value of the rank. Ex: 0000 0001 0000 0000 … 0000 means a King three of a kind
0010
0100
1000
We have = 4 possible combinations,
0111 or 1110 or 1011 or 1101
0111 1110 1011 1101
hh = (h) & (h >> 1) & (h >> 2) & (0x111…1)
hh = (h >> 1) & (h >> 2) & (h >> 3) & (0x111…1)
hh = (h) & (h >> 1) & (h >> 3) & (0x111…1)
hh = (h) & (h >> 2) & (h >> 3) & (0x111…1)
hh = ((h) & (h >> 1) & (h >> 2) & (0x111…1)) | ((h >> 1) & (h >> 2) & (h >> 3) & (0x111…1)) | ((h) & (h >> 1) & (h >> 3) & (0x111…1)) | ((h) & (h >> 2) & (h >> 3) & (0x111…1))
Combining all 4 possible combinations with OR, we have
Apply the distributivity rule to put out the (0x111…1) mask,
hh = (((h) & (h >> 1) & (h >> 2)) | ((h >> 1) & (h >> 2) & (h >> 3)) | ((h) & (h >> 1) & (h >> 3)) | ((h) & (h >> 2) & (h >> 3))) & (0x111…1))
(AC) + (BC) = (A+B)C
Check the hand for the left most 1-bit.
8 - Two Pair
Two pair is literally as the one pair algorithm, and very similar to the three of a kind / 4 of a kind algorithm. We are looking for 2 places where there are bits overlapped.
Case for tie: If both players have two pairs, check the values of the pairs. If tie, check kicker
→ Returns a 49-bit integer. Two pair when there are two places with 1 bits
We have = 6 possible combinations,
0011 or 0101 or 1001 or 1100 or 1010 or 0110
0011 0101
0110
hh = (h) & (h >> 1) & (0x111…1)
hh = (h) & (h >> 2) & (0x111…1)
…
hh = (h >> 1) & (h >> 2) & (0x111…1)
Combining all 6 possible combinations with OR, and applying distributivity, we have
hh = (((h) & (h >> 1)) | ((h) & (h >> 2)) | … | … | … | ((h >> 1) & (h >> 2))) & (0x111…1))
hh = hh >> 4
9 - One Pair
See Two pair for the algorithm.
Case for tie: If both players have pairs, check the value of the pair. If tie, check kicker.
→ Returns a 49-bit integer. One pair exists if hh
has a non-zero value
Four of a Kind happens when you find a group of four “1” bits next to each other, which are all of the same rank.
hh = (hh) & (hh >> 1) & (hh >> 2) & (hh >> 3) & (0x111…1)
0000…11110000
0000…01111000
0000…00111100
0000…00011110
0000…00010000
Example: Four of a Kind for 3s
hh = (h) >> 4 # Ignore first 4 aces
h = 0000…111100000000
“3”s
h = 0000…11110000
(h = h >> 4)
0001…00010001
(BIT_MASK)
(h)
(h >> 1)
(h >> 2)
(h >> 3)
&
&
&
&
=
Example: Three of a Kind for 3s
h = 0000…101100000000
“3”s
hh = 0000…00010000
…
0000…11110000
0000…01111000
0000…00111100
0000…00011110
h = 0000…111100000000
“3”s
h = 0000…11110000
(h = h >> 4)
0001…00010001
(BIT_MASK)
(h)
(h >> 1)
(h >> 2)
(h >> 3)
&
&
&
&
=
h = 0000…10110000
(h = h >> 4)
Embedded files
2c319581d58ec2c35124bb5b7a6f964c479d8966: 76b6e6d4f3dfefde076a203bc36116bae16ab169: 0077554832a116b9fd535514364127f8576e8885: Pasted Image 20220519223328_964.png