I’m building a simulator for a 40 card’s deck game. The deck is divided into 4 seeds, each one with 10 cards. Since there’s only 1 seed that’s different from the others ( let’s say, hearts ) , I’ve thinked of a quite convinient way to store a set of 4 cards with the same value in 3 bits: the first two indicate how many cards of a given value are left, and the last one is a marker that tells if the heart card of that value is still in the deck.
So,
{7h 7c 7s} = 101
That allows me to store the whole deck on 30 bits of memory instead of 40. Now, when i was programming in C, I’d have allocated 4 chars ( 1 byte each = 32 bits), and played with the values with bit operations.
In C# I can’t do that, since chars are 2 bytes each and playing with bits is much more of a pain, so, the question is : what’s the smallest amount of memory I’ll have to use to store the data required?
PS: Keep in mind that i may have to allocate 100k+ of those decks in system’s memory, so saving 10 bits is quite a lot
3 bytes gives you 24 bits, not 32… you need 4 bytes to get 32 bits. (Okay, some platforms have non-8-bit bytes, but they’re pretty rare these days.)
Yes, so you use
byteinstead ofchar. You shouldn’t be usingcharfor non-textual information.In what way?
But if you need to store 30 bits, just use an
intor auint. Or, better, create your own custom value type which backs the data with anint, but exposes appropriate properties and constructors to make it better to work with.Is it a significant amount though? If it turned out you needed to store 8 bytes per deck instead of 4 bytes, that means 800M instead of 400M for 100,000 of them. Still less than a gig of memory. That’s not that much…