#include <stdint.h>
#include <stdio.h>
#define GETMASK(index, size) (((1ULL << (size)) - 1ULL) << (index))
#define READFROM(data, index, size) (((data) & GETMASK((index), (size))) >>  (index))
#define WRITETO(data, index, size, value) ((data) = ((data) & (~GETMASK((index), (size)))) | ((value) << (index)))

#define FIELD(data, name, index, size) \
      inline uint64_t name() { return READFROM(data, index, size); } \
      inline void set_##name(uint64_t value) { WRITETO(data, index, size, value); }

struct A {
  uint16_t bitData;
  FIELD(bitData, one, 0, 1)
  FIELD(bitData, two, 1, 2)
};

int main() {
  struct A a;
  a.bitData = 2;
  
  uint16_t res = a.two();
  a.set_two(3);
  
  printf("res = %u\n", res);
  printf("a = %u\n", a.bitData);
  
  
}