#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);
}
I2luY2x1ZGUgPHN0ZGludC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2RlZmluZSBHRVRNQVNLKGluZGV4LCBzaXplKSAoKCgxVUxMIDw8IChzaXplKSkgLSAxVUxMKSA8PCAoaW5kZXgpKQojZGVmaW5lIFJFQURGUk9NKGRhdGEsIGluZGV4LCBzaXplKSAoKChkYXRhKSAmIEdFVE1BU0soKGluZGV4KSwgKHNpemUpKSkgPj4gIChpbmRleCkpCiNkZWZpbmUgV1JJVEVUTyhkYXRhLCBpbmRleCwgc2l6ZSwgdmFsdWUpICgoZGF0YSkgPSAoKGRhdGEpICYgKH5HRVRNQVNLKChpbmRleCksIChzaXplKSkpKSB8ICgodmFsdWUpIDw8IChpbmRleCkpKQoKI2RlZmluZSBGSUVMRChkYXRhLCBuYW1lLCBpbmRleCwgc2l6ZSkgXAogICAgICBpbmxpbmUgdWludDY0X3QgbmFtZSgpIHsgcmV0dXJuIFJFQURGUk9NKGRhdGEsIGluZGV4LCBzaXplKTsgfSBcCiAgICAgIGlubGluZSB2b2lkIHNldF8jI25hbWUodWludDY0X3QgdmFsdWUpIHsgV1JJVEVUTyhkYXRhLCBpbmRleCwgc2l6ZSwgdmFsdWUpOyB9CgpzdHJ1Y3QgQSB7CiAgdWludDE2X3QgYml0RGF0YTsKICBGSUVMRChiaXREYXRhLCBvbmUsIDAsIDEpCiAgRklFTEQoYml0RGF0YSwgdHdvLCAxLCAyKQp9OwoKaW50IG1haW4oKSB7CiAgc3RydWN0IEEgYTsKICBhLmJpdERhdGEgPSAyOwogIAogIHVpbnQxNl90IHJlcyA9IGEudHdvKCk7CiAgYS5zZXRfdHdvKDMpOwogIAogIHByaW50ZigicmVzID0gJXVcbiIsIHJlcyk7CiAgcHJpbnRmKCJhID0gJXVcbiIsIGEuYml0RGF0YSk7CiAgCiAgCn0=