【发布时间】:2012-09-14 19:05:48
【问题描述】:
我有一个问题,我有点卡住了,一位同事告诉我,这是寻求帮助的好地方。
我正在尝试在 Java 中实现 C 风格的位域。 这是一个粗略的示例(此时我面前没有实际的代码)。
typedef union
{
typedef struct
{
unsigned short a :1;
unsigned short b :1;
unsigned short c :2;
unsigned short d :10;
} bitfield;
unsigned short bitmap;
}example_bitfield;
我有很多来自遗留代码的类似风格的位域。我需要为 Java 提出一种等效方法的原因是,我正在编写将使用 Java 与使用 UDP 的其他遗留应用程序进行通信的代码。
我没有重写代码的选项。我知道这种方法不可移植,存在字节顺序问题(以及填充/对齐等),如果我能够重写代码,可以做得更好。不幸的是,我需要这个非常具体的问题的答案。系统是封闭的,所以我不需要担心编译器/操作系统/等的每一个可能的组合。
使用 Java EnumSet 的方法行不通,因为我相信这只会允许每个值是一位。我需要能够使用例如 d 占用 10 位的值来打包值。
我知道 Java Bitset,但它有局限性。我使用的是较旧版本的 Java,因此我没有一些较新的 Java Bitset 方法(即 valueOf 方法,可能肯定会有所帮助)。
有没有人知道如何尽可能地管理它?我有超过 10 个位域需要为我的通信实现。
感谢您提供的任何帮助!
【问题讨论】:
-
请注意,您的原始示例实际上是未定义的行为。
-
你有一个旧的和有限的 Java 版本,你能告诉我们它是什么吗?
-
它是 Java SE 6。从技术上讲,位域是使用 c++ 编译器编译的。我相信 c++ 添加了对使用整数以外的类型的支持。如果它是未定义的,我可以接受……我没有更正它的选项,而且它当前正在做的任何行为都是我必须效仿的。
标签: java bit-fields bitset