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.
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.
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.
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();
}
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