当前位置: 首页 > 面试题库 >

在Java中实现C样式位域

壤驷深
2023-03-14
问题内容

我有一个问题,我有点被困住了,一位同事告诉我,这将是寻求帮助的好地方。

我正在尝试在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的旧应用程序进行通信的代码。

我没有重写代码的选择。我知道这种方法不是可移植的,存在字节序问题(以及填充/对齐等),并且如果我能够重写代码,可以采用更好的方法。不幸的是,我需要针对这个非常具体的问题的答案。系统是封闭的,因此我不必担心编译器/操作系统/
ect的每种可能组合。

使用Java EnumSet的方法将行不通,因为我相信这只会将每个值设为一位。我需要能够将d的值打包(例如占用10位)。

我了解Java Bitset,但是它有局限性。我使用的是Java的较旧版本,因此我没有一些较新的Java
Bitset方法(即valueOf方法可能肯定会有所帮助)。

是否有人对如何使其尽可能易于管理有任何想法?我的通讯需要实现10多个位域。

感谢您提供任何帮助!


问题答案:

由于UDP只接受字节数组,因此可以以任何合适的方式声明java类,并且唯一的关键步骤是定义序列化和反序列化方法:

class example_bitfield {
  byte a;
  byte b;
  byte c;
  short d;

  public void fromArray(byte[] m) {
    byte b0=m[0];
    byte b1=m[1];
    a=b0>>>7;
    b=(b0>>6)&1;
    c=(b0>>4)&3;
    d=(b0&0xF<<6)|(b1>>>2);
  }
  public void toArray(byte[] m) {
    m[0]=(a<<7)|(b<<6)|(c<<4)|(d>>>6);
    m[1]=(d&0x3F)<<2;
  }
}


 类似资料:
  • 问题内容: 我想要具有不同状态的实体(控件或属性),可以通过CSS对其进行着色。 例如,以TextField为例,它可以包含两种值,正常值和错误值。一旦包含错误值,则应显示为“红色”。但是实际颜色应该可以从CSS定义。 这可能实现吗? 我发现了很多接口或类,但是它们看起来可以接受任何样式。 我可以编写和实体,从价值中衍生出风格吗? 问题答案: 您可以使用: 用这样的CSS: 虽然老实说,我不能完全

  • 我真的不知道如何获得这个实现,即获取一个数据,它将是动态的,并用上面的样式表示。 我衷心感谢你抽出时间。 我得到了 原因:controllers.home_pageController处的java.lang.nullPointerException。controlers.home_pageController处的getGrid(home_pageController.java:85)。start(

  • 问题内容: 在C#中,如果有两个具有相同方法的基本接口(例如F()),则可以使用显式实现来执行不同的impl。对于F()。这使您可以不同地对待与当前视图相对应的对象:作为IMyInterface1或IMyInterface2。这在Java中可行吗? 问题答案: 不,没有像Java中C#的显式接口实现那样的东西。 从好的方面来说,Java具有协变量返回类型,因此,如果您想提供比接口指定的类型更强的实

  • 本文向大家介绍C#中DataGridView的样式,包括了C#中DataGridView的样式的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#中DataGridView的样式。分享给大家供大家参考。具体如下: 1、设置grid交替行颜色 2、单元格内容有效性检查 3、 单元格的选择模式 4、设置合适的列宽 希望本文所述对大家的C#程序设计有所帮助。

  • 问题内容: 谁能提供一个单例模式的示例并解释为什么有必要吗? 问题答案: 在走单身路线之前,请重新考虑。您真的需要单身人士吗?如果您需要实现单例的方案,那是因为对它们的需求并没有真正表达出来。您最好不要仅在代码库中引入单例,因为遵循设计模式会很酷。 干净的代码讨论-全局状态和单例 一次还不够 表演者单身人士 但是,真正值得了解的是Dependency Injection 。 现在,如果您真的想用J

  • 模板方法模式提供了抽象基类具有不可重写的方法:该方法实现了通用算法,不应在子类中重写。在Java中,模板方法在抽象基类中声明为final,在C中,sealed关键字具有类似的含义,但不能声明未重写的方法。 我如何解决这个问题?为什么不能阻止一个方法可以被子类重写(在C中)?