Dart中的位域等价的并集是什么?

wecizke3  于 2023-02-06  发布在  其他
关注(0)|答案(1)|浏览(109)

我想在Dart中实现下面的C代码:

union AuxiliaryHardwares {
  uint16_t all = 0;

  struct {
    hasRs485: 1;
    hasCanbus: 1;
    hasRelay0: 1;
    hasRelay1: 1; 
  };
};

AuxialiaryHardwares ah;

ah.all = 123; // Or any value I read from the network

if (ah.hasCanbus) {
  // blah blah
}
if (ah.hasRelay0) {
  // blah blah
}
oalqel3c

oalqel3c1#

没有语言支持将整数的单个位作为整数或布尔变量访问。
传统上,你会自己写。

class AuxiliaryHardwares {
  static const int _rs485Flag = 1; 
  static const int _canbusFlag = 2;
  static const int _relay0Flag = 4;
  static const int _relay1Flag = 8;

  int all = 0;  

  bool get hasRs45 => all & _rs45Flag != 0;
  bool get hasCanbus => all & _canbusFlag != 0;
  bool get hasRelay0 => all & _relay0Flag != 0;
  bool get hasRelay1 => all & _relay1Flag != 0;

  // Setters too if you want them, e.g.
  void set hasRs45(bool value) {
    all = value ? (all | _rs45Flag) : (all & ~_rs45Flag);
  }
}

您可能会在某个地方找到一个位集类,它对访问整数的各个位进行抽象,但这将是额外的开销,而收益非常小。
我预计“内联类”将是将来封装整数的方式。

相关问题