brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.5 KiB · d14edda Raw
57 lines · cpp
1typedef unsigned int uint32_t;2 3enum MaskingOperator {4  eMaskingOperatorDefault = 0,5  eMaskingOperatorAnd = 1,6  eMaskingOperatorOr = 2,7  eMaskingOperatorXor = 3,8  eMaskingOperatorNand = 4,9  eMaskingOperatorNor = 510};11 12class MaskedData {13private:14  uint32_t value;15  uint32_t mask;16  MaskingOperator oper;17 18public:19  MaskedData(uint32_t V = 0, uint32_t M = 0,20             MaskingOperator P = eMaskingOperatorDefault)21      : value(V), mask(M), oper(P) {}22 23  uint32_t apply() {24    switch (oper) {25    case eMaskingOperatorAnd:26      return value & mask;27    case eMaskingOperatorOr:28      return value | mask;29    case eMaskingOperatorXor:30      return value ^ mask;31    case eMaskingOperatorNand:32      return ~(value & mask);33    case eMaskingOperatorNor:34      return ~(value | mask);35    case eMaskingOperatorDefault: // fall through36    default:37      return value;38    }39  }40 41  void setValue(uint32_t V) { value = V; }42 43  void setMask(uint32_t M) { mask = M; }44 45  void setOperator(MaskingOperator P) { oper = P; }46};47 48int main() {49  MaskedData data_1(0xFF0F, 0xA01F, eMaskingOperatorAnd);50  MaskedData data_2(data_1.apply(), 0x1AFC, eMaskingOperatorXor);51  MaskedData data_3(data_2.apply(), 0xFFCF, eMaskingOperatorOr);52  MaskedData data_4(data_3.apply(), 0xAABC, eMaskingOperatorAnd);53  MaskedData data_5(data_4.apply(), 0xFFAC, eMaskingOperatorNor);54  MaskedData data_6(data_5.apply(), 0x0000BEEF, eMaskingOperatorAnd);55  return data_6.apply(); // <-- what comes out of here?56}57