Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中正确执行二进制开关语句?_Java_Arrays_List_Libgdx_Switch Statement - Fatal编程技术网

如何在java中正确执行二进制开关语句?

如何在java中正确执行二进制开关语句?,java,arrays,list,libgdx,switch-statement,Java,Arrays,List,Libgdx,Switch Statement,我正在做一个游戏,我需要将我的二进制瓷砖id集转换成一个switch语句,这样我就可以从sprite表中获取正确的瓷砖 我需要将这个列表转换成一个整数,我可以使用这个整数来获取我的tile id。这个列表包含了我需要的所有可能的tile,从255个到48个左右的tile 我可以得到一些关于开始这个声明的帮助吗 还有一个x意味着设置什么位并不重要 编辑:也应该说这是一个8位数字DCBA4321 我建议您学习Java的逐位运算符: 一旦屏蔽了该值,就可以确定要获取的正确磁贴。我建议您研究Java的逐

我正在做一个游戏,我需要将我的二进制瓷砖id集转换成一个switch语句,这样我就可以从sprite表中获取正确的瓷砖

我需要将这个列表转换成一个整数,我可以使用这个整数来获取我的tile id。这个列表包含了我需要的所有可能的tile,从255个到48个左右的tile

我可以得到一些关于开始这个声明的帮助吗

还有一个x意味着设置什么位并不重要

编辑:也应该说这是一个8位数字DCBA4321


我建议您学习Java的逐位运算符:


一旦屏蔽了该值,就可以确定要获取的正确磁贴。

我建议您研究Java的逐位运算符:


一旦屏蔽了值,就可以确定要获取的正确磁贴。

我建议为每个可能的组合创建一个256个值的静态数组,如下所示:

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, 
    ...
};
有了这样的数组,您只需使用按位移位将DCBA和4321值连接起来,然后将其添加并映射到值。这似乎是我最快的方法

int getValue(int DCBA, int num) {
    return DCBA4321_TO_VALUE[(DCBA << 4)+num];
}

我建议为每个可能的组合创建一个256个值的静态数组,如下所示:

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, 
    ...
};
有了这样的数组,您只需使用按位移位将DCBA和4321值连接起来,然后将其添加并映射到值。这似乎是我最快的方法

int getValue(int DCBA, int num) {
    return DCBA4321_TO_VALUE[(DCBA << 4)+num];
}

除非有从dcba4321到目标值的数学公式,否则必须执行以下操作。我已将其分解为子部分,以帮助支持可读性和维护

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
....

除非有从dcba4321到目标值的数学公式,否则必须执行以下操作。我已将其分解为子部分,以帮助支持可读性和维护

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
....

我还会使用switch语句吗?我还会使用switch语句吗?看起来很有趣,看起来确实很快。那么硬编码值中的下一行是2121241630吗?下一排呢?1 1 3 3 3?在答案上又增加了两行。您有一个方便的低位和列,它给出了4321个值应该映射到目标值的提示。例如,0-3,8-11意味着我们应该在一行中有8个:在位置0-3和位置8-11。从现在起就完美了,谢谢!我将尝试这个和另一个方法,看看结果如何。似乎您的DCBA已经发生了变化。在这种情况下,您应该添加它们:replace DCBA看起来很有趣,而且看起来非常快。那么硬编码值中的下一行是2121241630吗?下一排呢?1 1 3 3 3?在答案上又增加了两行。您有一个方便的低位和列,它给出了4321个值应该映射到目标值的提示。例如,0-3,8-11意味着我们应该在一行中有8个:在位置0-3和位置8-11。从现在起就完美了,谢谢!我将尝试这个和另一个方法,看看结果如何。似乎您的DCBA已经发生了变化。在这种情况下,您只需添加它们:替换DCBA我将尝试这一个和下面的几个,并测试性能。因为似乎有很多方法可以做到这一点。在这一点上我学到了很多我将尝试这一个和下面的几个,并测试性能。因为似乎有很多方法可以做到这一点。在这一点上我学到了很多