views:

116

answers:

5
+3  A: 

The least you'll need to store these three bits is one byte.

Read this tutorial on bitwise operators to get started.

Edit: this page on bit masks may also be very helpful.

mdrg
+3  A: 

You say three states, but you've actually got six: forward, forward-left, forward-right, left, right, stand-still. Unless your race car doesn't move sideways ofcourse, then you've got four.

You should really use an enum for this:

enum State { FORWARD, FORWARD_LEFT, FORWARD_RIGHT, STAND_STILL }

Since left, right and forward are mutually exclusive, this isn't a very good fit for a bit-fiddling program. You'll get into all kinds of consistency problems.

larsmans
Unless you need to serialize your object over a medium were every byte counts, use enums. They are more legible and have features that allow you to do loops over the state or switch statements. Even if you do need a compressed format, it would be easier to use enums and then build the compressed version as needed.
unholysampler
Thus avoiding the consistency problem until deserialization. Thanks, unholysampler.
larsmans
I in fact am serializing over a medium where every bit counts, thats my fault for not being explicit.
Doodle
+1  A: 

In java.util there is a class called BitSet that makes bit manipulation very simple.

In your case you could create a BitSet of size 3 and then use the get() and set() methods to set a check the bits.

Aaron
+4  A: 

I would suggest using BitSet along with enum's

enum State { LEFT, RIGHT, FORWARD,STAND_STILL}

BitSet stat=new BitSet(4);

void setLeft() // and so on for each state
{
 stat.set(State.LEFT);
}
boolean isLeft()
{
 stat.get(State.LEFT);
}
void reset() //reset function to reset the state
{
  stat.clear();
}
Emil
Thank you for you answer. Yours an KarlP's answer are both worth the check mark. I in fact used your example in code.
Doodle
+1  A: 

If size and speed is important, use bits in a byte. (Read the links posted in the other answer as there are complications when using signed datatypes and casting that is not obvious.)

This encodes for the speeds: stand, left, left_forward, forward, right_forward, and right.

public class Moo {

final static byte FORWARD = 0x1; // 00000001
final static byte LEFT     =0x2; // 00000010
final static byte RIGHT    =0x4; // 00000100

/**
 * @param args
 */
public static void main(String[] args) {

    byte direction1 = FORWARD|LEFT;  // 00000011
    byte direction2 = FORWARD|RIGHT; // 00000101
    byte direction3 = FORWARD|RIGHT|LEFT; // 00000111

    byte direction4 = 0;

    // someting happens:
    direction4 |= FORWARD;
    // someting happens again.
    direction4 |= LEFT;

    System.out.printf("%x: %s\n", direction1, dirString(direction1));
    System.out.printf("%x: %s\n", direction2, dirString(direction2));
    System.out.printf("%x: %s\n", direction3, dirString(direction3));
    System.out.printf("%x: %s\n", direction4, dirString(direction4));


}

public static String dirString( byte direction) {
    StringBuilder b = new StringBuilder("Going ");

    if( (direction & FORWARD) > 0){
        b.append("forward ");
    }

    if( (direction & RIGHT) > 0){
        b.append("turning right ");
    }
    if( (direction & LEFT) > 0){
        b.append("turning left ");
    }
    if( (direction &( LEFT|RIGHT)) == (LEFT|RIGHT)){
        b.append(" (conflicting)");
    }

    return b.toString();
}

}

Output:

3: Going forward turning left 
5: Going forward turning right 
7: Going forward turning right turning left  (conflicting)
3: Going forward turning left 

Note also that Left and Right is mutually exclusive, so its possible to create an illegal combination. (7 = 111 )

If you actually meant that a thing can only move LEFT, FORWARD or RIGHT, then you don't need flags, just enums.

This enum is possible to transport in only two bits.

    enum Direction{
    NONE, FORWARD, RIGHT, LEFT;

}


Direction dir = Direction.FORWARD;
byte enc = (byte) dir.ordinal();

The final two bits in enc will become:

00 : none  
01 : forward;
10 : right
11 : left
KarlP