fork download
  1. #include <stdint.h>
  2. #include <stdio.h>
  3. #define GETMASK(index, size) (((1ULL << (size)) - 1ULL) << (index))
  4. #define READFROM(data, index, size) (((data) & GETMASK((index), (size))) >> (index))
  5. #define WRITETO(data, index, size, value) ((data) = ((data) & (~GETMASK((index), (size)))) | ((value) << (index)))
  6.  
  7. #define FIELD(data, name, index, size) \
  8.   inline uint64_t name() { return READFROM(data, index, size); } \
  9.   inline void set_##name(uint64_t value) { WRITETO(data, index, size, value); }
  10.  
  11. struct A {
  12. uint16_t bitData;
  13. FIELD(bitData, one, 0, 1)
  14. FIELD(bitData, two, 1, 2)
  15. };
  16.  
  17. int main() {
  18. struct A a;
  19. a.bitData = 2;
  20.  
  21. uint16_t res = a.two();
  22. a.set_two(3);
  23.  
  24. printf("res = %u\n", res);
  25. printf("a = %u\n", a.bitData);
  26.  
  27.  
  28. }
Success #stdin #stdout 0s 3460KB
stdin
Standard input is empty
stdout
res = 1
a = 6