Here is the detailed code :
//ENCODE STATUS
unsigned char NewStatus(unsigned char table, unsigned char pos, unsigned cards){
table = table-1; //convert table 1,2,3,4,5,6 starting from 0 (0,1,2,3,4,5)
table = table & B00000111;
table = table<<5;
pos = pos-1; //same as table
pos = pos & B00000011;
pos = pos<<3;
cards = cards-1;//same as table
cards = cards & B00000111;
return table+pos+cards;
}
//DECODE STATUS
unsigned char GetTable(unsigned char &PlayerStatus){
unsigned char table;
table=PlayerStatus;
table=table & B11100000;
table=table>>5;
table=table+1; //convert from 0,1,2... to 1,2,3...
return table;
}
unsigned char GetPosition(unsigned char &PlayerStatus){
unsigned char pos;
pos=PlayerStatus;
pos=pos & B00011000;
pos=pos>>3;
pos=pos+1; //same as table...
return pos;
}
unsigned char GetCards(unsigned char &PlayerStatus){
unsigned char cards;
cards=PlayerStatus;
cards=cards & B00000111;
cards=cards+1; //same as table...
return cards;
}
void PrintStatus(unsigned char &PlayerStatus){
unsigned char table;
table=GetTable(PlayerStatus);
unsigned char pos;
pos=GetPosition(PlayerStatus);
unsigned cards;
cards=GetCards(PlayerStatus);
Serial.print("Table : ");
Serial.print(table,DEC);
Serial.print(" ,Position : ");
Serial.print(pos,DEC);
Serial.print(" ,Cards : ");
Serial.println(cards,DEC);
}
void setup() // the set up part (runs only once)
{
Serial.begin(9600); // set up Serial library at 9600 bps
//Assign status at john, mary and bob
unsigned char JohnBlackjackStatus = NewStatus(2,3,1);
//John sits at 2nd table (1,2,3,4,5,6 tables) at 3rd position (1,2,3,4)
//with 1 card in hand (1,2,3,4,5,6,7,8)
unsigned char MaryBlackjackStatus = NewStatus(1,2,3);
//Mary sits at 1st table (1,2,3,4,5,6 tables) at 2nd position (1,2,3,4)
//with 3 cards in hand (1,2,3,4,5,6,7,8)
unsigned char BobBlackjackStatus = NewStatus(5,3,5);
//Bob sits at 5th table (1,2,3,4,5,6 tables) at 3rd position (1,2,3,4)
//with 5 cards in hand (1,2,3,4,5,6,7,8)
//Print status
Serial.println("John's status : ");
PrintStatus(JohnBlackjackStatus);
Serial.println("Mary's status : ");
PrintStatus(MaryBlackjackStatus);
Serial.println("Bob's status : ");
PrintStatus(BobBlackjackStatus);
Serial.println("It is Bob's turn. Bob thinks ...");
delay(3000);
Serial.println("Bob decides to hit (take a card)");
BobBlackjackStatus = NewStatus( GetTable(BobBlackjackStatus),
GetPosition(BobBlackjackStatus),
GetCards(BobBlackjackStatus) + 1 );
Serial.println("Bob's new status : ");
PrintStatus(BobBlackjackStatus);
}
void loop() // The main loop (runs over and over again)
{
// do nothing...
}
Here you can download the source code for this demo : BitwiseExample
I know that some of you might find this article a bit difficult but if you reread it from the beginning i am pretty sure you should understand everything.
You can see below some reference links :
http://arduino.cc/en/Reference/BitwiseAnd
http://www.arduino.cc/playground/Code/BitMath
http://graphics.stanford.edu/~seander/bithacks.html