Если важны размер и скорость, используйте биты в байте.(Прочитайте ссылки, опубликованные в другом ответе, поскольку существуют неочевидные сложности при использовании и приведении типов данных со знаком.)
Это кодирует для скоростей: стоять, влево, влево, вперед, вперед, вправо и вперед.
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();
}
}
Вывод:
3: Going forward turning left
5: Going forward turning right
7: Going forward turning right turning left (conflicting)
3: Going forward turning left
Обратите также внимание, что Left и Right являются взаимоисключающими, поэтому возможно создание недопустимой комбинации.(7 = 111)
Если вы действительно имели в виду, что вещь может двигаться только ВЛЕВО, ВПЕРЕД или ВПРАВО, тогда вам не нужны флаги, просто перечисления.
Это перечисление можно передавать только в двух битах.
enum Direction{
NONE, FORWARD, RIGHT, LEFT;
}
Direction dir = Direction.FORWARD;
byte enc = (byte) dir.ordinal();
Последние два бита в enc
станут:
00 : none
01 : forward;
10 : right
11 : left