#include struct _b { char a; short b:9; }; struct _bb { char a; int :0; int b:10; int :0; int b0:10; int :0; int b1:10; int :0; int b2:10; int :0; int b4:30; char c; }; union _cc { struct { char a; int b:1; // bit 8 int b1:1; // bit 9 int b2:24; // bits 32..55 char c; }; unsigned long long ull; }; union _cc2 { struct { char a; int b:24; // bit 8 int b1:1; int b2:1; char c; }; unsigned long long ull; }; union _dd { struct { int a0:10; int a1:10; int a2:10; int a3:10; int a4:10; }; struct { unsigned long long ull; }; }; struct _ee { short s:9; short j:9; char c; }; typedef long long int int64_t; typedef unsigned long long int uint64_t; typedef int int32_t; typedef unsigned int uint32_t; typedef short int16_t; typedef unsigned short uint16_t; typedef char int8_t; typedef unsigned char uint8_t; #define lomask(type,n) (type)((((type)1)<<(n))-1) uint64_t get_u_bitfield(char *ptr, int typesz, int boffs, int blen) { uint64_t i8; uint32_t i4; uint16_t i2; uint8_t i1; switch (typesz) { case 8: i8 = *(uint64_t*)ptr; return (i8>>boffs) & lomask(uint64_t,blen); case 4: i4 = *(uint32_t*)ptr; return (i4>>boffs) & lomask(uint32_t,blen); case 2: i2 = *(uint16_t*)ptr; return (i2>>boffs) & lomask(uint16_t,blen); case 1: i1 = *(uint8_t*)ptr; return (i1>>boffs) & lomask(uint8_t,blen); } //error return 0; } int64_t get_s_bitfield(char *ptr, int typesz, int boffs, int blen) { int64_t i8; int32_t i4; int16_t i2; int8_t i1; switch (typesz) { case 8: i8 = *(int64_t*)ptr; return (i8<<(64-boffs-blen))>>(64-blen); case 4: i4 = *(int32_t*)ptr; return (i4<<(32-boffs-blen))>>(32-blen); case 2: i2 = *(int16_t*)ptr; return (i2<<(16-boffs-blen))>>(16-blen); case 1: i1 = *(int8_t*)ptr; return (i1<<(8-boffs-blen))>>(8-blen); } //error return 0; } void set_bitfield(char *ptr, int typesz, int boffs, int blen, uint64_t v) { uint64_t i8, m8; uint32_t i4, m4; uint16_t i2, m2; uint8_t i1, m1; switch (typesz) { case 8: m8 = lomask(uint64_t,blen)<