如何在 java 中正确执行二进制 switch 语句?
How can I correctly do a binary switch statement in java?
我正在开发一款游戏,我需要将我的二进制图块 ID 集转换为 switch 语句,以便我可以从精灵中获取正确的图块 sheet。
我需要将包含我需要的所有可能图块的列表从 255 个转换为仅 48 个左右的图块,并将其转换为可用于获取我的图块 ID 的整数。
我可以得到一些关于开始这个声明的帮助吗?
还有一个 x 表示在那里设置什么位并不重要。
编辑:还应该说这是一个 8 位数字 DCBA4321
我建议您学习 Java 的位运算符:Click Here
class BitDemo {
public static void main(String[] args) {
int bitmask = 0x000F;
int val = 0x2222;
// prints "2"
System.out.println(val & bitmask);
}
}
屏蔽该值后,您可以确定要抓取的正确图块。
我建议为每个可能的组合创建一个包含 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
....
我正在开发一款游戏,我需要将我的二进制图块 ID 集转换为 switch 语句,以便我可以从精灵中获取正确的图块 sheet。
我需要将包含我需要的所有可能图块的列表从 255 个转换为仅 48 个左右的图块,并将其转换为可用于获取我的图块 ID 的整数。
我可以得到一些关于开始这个声明的帮助吗?
还有一个 x 表示在那里设置什么位并不重要。
编辑:还应该说这是一个 8 位数字 DCBA4321
我建议您学习 Java 的位运算符:Click Here
class BitDemo {
public static void main(String[] args) {
int bitmask = 0x000F;
int val = 0x2222;
// prints "2"
System.out.println(val & bitmask);
}
}
屏蔽该值后,您可以确定要抓取的正确图块。
我建议为每个可能的组合创建一个包含 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
....