views:

711

answers:

5
+2  A: 

You're not really "parsing" as such, just doing some simple bit manipulation.

int card = currentDeck[num];
int suit = (card & 0xF0) >> 4;
int value = card & 0x0F;

Will do what you want.

Dean Harding
Oh, so it is possible to do bit shifting. That is actually what I wanted to do in the first place, but I thought it only worked when you want to work with the bits in binary code. I will try this soon.Edit: Just curious, what is the logic behind this, particularly the 0xF0 part?
Biosci3c
Okay, int value works fine, but suit just reads '0'.
Biosci3c
Should be int suit = (card
Dipstick
Sorry, I edited my answer, the >> was wrong - it should have been 4, not 8.
Dean Harding
+1  A: 

You can try

int card = originalCards[1];
int suit = card /16;
int value = card % 16; 
astander
+2  A: 

Here's an answer using bit fields.

struct {
    unsigned int suit:4;
    unsigned int value:4;
} card    = currentDeck[num];
int suit  = card.suit;
int value = card.value;

You may need to add in int for padding as either the first or last field to line the bits up properly. Bit fields are normally used to access hardware because hardware registers frequently pack multiple flags into a single byte.

By the way if you use the bit shift, you want to shift by the number of bits in a hexadecimal digit. One hex digit holds values 0 - 15 or 0 - F, this requires 4 bits not 8. So this should be used:

int suit = (card & 0xF0) >> 4;
Robert Menteer
The bit shifting still doesn't work for int suit.
Biosci3c
+2  A: 

To answer your question about the use of 0xF0 and 0x0F in the bit shift example what they are doing is a bitwise and. When you do card & 0xF0 what you are doing is anding the two values, this results in setting all bits except the 4 you are interested in to 0. Ex:

 0x48   01001000     0x48   01001000
&0x0F  &00001111    &0xF0  &11110000
-----   --------     ----   --------
 0x08   00001000     0x48   01000000 >> 4
                            --------
                            00000100
Robert Menteer
How come I keep getting zero when I try to get the upper digit?
Biosci3c
A: 

Here is a working example:

using System;

namespace Test
{
    class MainClass
    {
        static int[] currentDeck = new int[54] {
                0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D,
                0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D,
                0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D,
                0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D,
                0x50, 0x51 };

        static void printParts (int num)
        {
            int card  = currentDeck[num];
            int suit  = (card & 0xF0) >> 4;
            int value = (card & 0x0F);

            Console.Out.WriteLine(
                    String.Format ("Card: {0:x4},   ", card) +
                    String.Format ("Suit: {0:x4},   ", suit) +
                    String.Format ("Value: {0:x4}", value ));
        }


        public static void Main (string[] args)
        {
            printParts(  7 );
            printParts( 18 );
            printParts( 30 );
            printParts( 48 );
        }
    }
}

This produces the following:

Card: 0018,   Suit: 0001,   Value: 0008
Card: 0026,   Suit: 0002,   Value: 0006
Card: 0035,   Suit: 0003,   Value: 0005
Card: 004a,   Suit: 0004,   Value: 000a

I'm not sure why your upper digits are not correct.

Robert Menteer