如何在java中正确执行二进制开关语句?
我正在做一个游戏,我需要将我的二进制瓷砖id集转换成一个switch语句,这样我就可以从sprite表中获取正确的瓷砖 我需要将这个列表转换成一个整数,我可以使用这个整数来获取我的tile id。这个列表包含了我需要的所有可能的tile,从255个到48个左右的tile 我可以得到一些关于开始这个声明的帮助吗 还有一个x意味着设置什么位并不重要 编辑:也应该说这是一个8位数字DCBA4321如何在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的逐
我建议您学习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我将尝试这一个和下面的几个,并测试性能。因为似乎有很多方法可以做到这一点。在这一点上我学到了很多我将尝试这一个和下面的几个,并测试性能。因为似乎有很多方法可以做到这一点。在这一点上我学到了很多