Ответ 1
Если размер и скорость важны, используйте биты в байте. (Прочитайте ссылки, опубликованные в другом ответе, поскольку при использовании и литье подписанных типов данных возникают неочевидные осложнения.)
Это кодирует для скоростей: stand, left, left_forward, forward, right_forward и 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();
}
}
Вывод:
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