对于应用程序,我需要一个24位的无符号数据类型。 不幸的是,这种数据类型在Java中不可用。我打算将它作为一个新类实现。但我不确定这种实现的性能。
建议我自己上课吗?
如果可取,是否可以获得良好的表现?
答案 0 :(得分:4)
据推测,你的意思是将它实现为一个使用更大数据类型和边界检查的类,如下所示:
public class Unsigned24 {
private static final MAX_UNSIGNED24 = Math.pow(2, 24) - 1;
private static final MIN_UNSIGNED24 = 0;
private final int value;
public Unsigned24(int value) {
if (value > MAX_UNSIGNED24 || value < MIN_UNSIGNED24)
throw new IllegalArgumentException("value out of bounds: " + value);
this.value = value;
}
public int getValue() {
return value;
}
// ... other methods, such as equals(), comparison, addition, subtraction, etc.
}
这样可行,但可能不值得。此外,它实际上并不只占用24位内存,而是32加上对象的开销。
这实际上取决于你的目标。为什么要一个24位整数。
这只是因为你对这些值有限制吗?如果是这样,你可能想要做类似上面的事情。
是因为你有很多,想要节省内存吗?如果是这样,您可能希望构建一个抽象24位整数数组的类,并在内部将它们连续保存在字节数组中。
是否因为您正在与某些需要24位的硬件或网络接口连接?在这种情况下,您可能希望查看java.nio类。
答案 1 :(得分:3)
如果你想节省空间,你可以使用int进行计算,并将最不重要的3个字节映射到byte []或只是三个字节:
public static byte[] convert(int i) {
return new byte[]{ (i & 0xff0000) >> 16, (i & 0xff00) >> 8, (i & 0xff) };
}
public static int convert(byte[] b) {
if (b == null && b.length != 3)
throw new IllegalArgumentException();
return (b[2] << 16) | (b[1] << 8) | b;
}
(无法验证它是否没有错误,但至少应该提出一个想法)