Comment puis-je faire correctement une instruction de commutateur binaire en java?


Je travaille sur un jeu et j'ai besoin de convertir mon id de tuile binaire en une instruction switch afin de pouvoir récupérer la tuile correcte à partir de la feuille de sprite.

Je dois convertir cette liste qui contient toutes les tuiles possibles dont j'aurais besoin de 255 à seulement 48 Tuiles en un entier que je peux utiliser pour obtenir mon id de tuile.

Puis-je obtenir de l'aide pour démarrer cette déclaration?

Aussi un x signifie que peu importe le bit qui y est défini.

EDIT: Devrait aussi dire que ceci est un nombre de 8 bits DCBA4321

entrez la description de l'image ici

Author: Snhp9, 2015-05-07

3 answers

Je recommanderais de créer un tableau statique de 256 valeurs pour chaque combinaison possible comme ceci:

static final int[] DCBA4321_TO_VALUE = {
    // 0000
    47, 44, 36,343, 37, 14, 35, 32, 45, 34, 15, 40, 42, 41, 33, 38,
    // 0001
    28, 28, 27, 27, 26, 26, 23, 23, 28, 28, 27, 27, 26, 26, 23, 23, 
    // 0010
    21, 21, 21, 21, 24, 24, 24, 24, 16, 16, 16, 16, 30, 30, 30, 30,
    // 0011
     1,  1,  1,  1,  3,  3,  3,  3,  1,  1,  1,  1,  3,  3,  3,  3, 
    ...
};

Ayant un tel tableau, vous pouvez simplement joindre vos valeurs DCBA et 4321 en utilisant un décalage au niveau du bit et l'ajouter et le mapper à value. Cela semble être l'approche la plus rapide pour moi

int getValue(int DCBA, int num) {
    return DCBA4321_TO_VALUE[(DCBA << 4)+num];
}
 2
Author: Tagir Valeev, 2015-05-07 04:34:31

Je vous recommande d'étudier les opérateurs bit à bit de Java: Cliquez ici

class BitDemo {
  public static void main(String[] args) {
    int bitmask = 0x000F;
    int val = 0x2222;
    // prints "2"
    System.out.println(val & bitmask);
  }
}

Une fois que vous avez masqué la valeur, vous pouvez déterminer la tuile correcte à saisir.

 1
Author: Grady G Cooper, 2015-05-07 04:16:43

Sauf si vous avez une formule mathématique pour passer de dcba4321 à la valeur cible, vous devrez faire quelque chose comme ce qui suit. Je l'ai divisé en sous-partie pour aider à soutenir la lisibilité et la maintenance.

byte dcba = dcba4312 & 0b11110000 >> 4
byte _4321 dcba4321 & 0b00001111;

switch (dcba) {
case 0b0000:
  return dcba0(_4321);
case 0b001:
  return dcba1(_4321);
...
  rest of the dcba cases;
...
}

dcba0(byte _4321) {
  switch (_4321) {
    case 0:
      return 47;
    case 1:
      return 44;
    ....
      rest of the cases
    ....
  }
}

....
rest of the dcbaX methods
....
 1
Author: Brett Walker, 2015-05-07 04:23:05