Out of pure curiosity I decided to check what 'gcc -O3' produces when we use bitfields and masks. As of 'gcc version 8.2.1 20181105 (Red Hat 8.2.1-5) (GCC)' 1) bitfields: struct abc { int enabled:1; int _pad:7; int vec:8; }; int is_good(struct abc *s) { if (s->enabled) return s->vec; else return 0; } results in is_good: xorl %eax, %eax testb $1, (%rdi) je .L1 movsbl 1(%rdi), %eax .L1: ret 2) masks #include <stdint.h> #define S_ENABLED 1 #define S_VEC_MASK 0xff00 #define S_VEC_SHIFT 8 int is_good(uint16_t *s) { if (*s & S_ENABLED) return (*s & S_VEC_MASK) >> S_VEC_SHIFT; else return 0; } results in is_good: movzwl (%rdi), %edx movzbl %dh, %eax andl $1, %edx movl $0, %edx cmove %edx, %eax ret so bitfields version looks somewhat more efficient. I'm not sure if my example is too synthetic though. -- Vitaly