Skip to content

Instantly share code, notes, and snippets.

@wjlafrance
Last active August 29, 2015 14:18
Show Gist options
  • Save wjlafrance/0241e00f2701575f7fba to your computer and use it in GitHub Desktop.
Save wjlafrance/0241e00f2701575f7fba to your computer and use it in GitHub Desktop.
abusing the crap out of union
#include <stdio.h>
#include <stdint.h>
union BitAccessor {
uint64_t u64;
struct {
uint32_t _0, _1;
} u32;
struct {
uint16_t _0, _1, _2, _3;
} u16;
struct {
uint8_t _0, _1, _2, _3, _4, _5, _6, _7;
} u8;
struct {
uint8_t _0 : 4, _1 : 4, _2 : 4, _3 : 4, _4 : 4, _5 : 4, _6 : 4, _7 : 4, _8 : 4, _9 : 4, _A : 4, _B : 4, _C : 4, _D : 4, _E : 4, _F : 4;
} u4;
struct {
uint8_t _00 : 2, _01 : 2, _02 : 2, _03 : 2, _04 : 2, _05 : 2, _06 : 2, _07 : 2, _08 : 2, _09 : 2, _0A : 2, _0B : 2, _0C : 2, _0D : 2, _0E : 2, _0F : 2;
uint8_t _10 : 2, _11 : 2, _12 : 2, _13 : 2, _14 : 2, _15 : 2, _16 : 2, _17 : 2, _18 : 2, _19 : 2, _1A : 2, _1B : 2, _1C : 2, _1D : 2, _1E : 2, _1F : 2;
} u2;
struct {
uint8_t _00 : 1, _01 : 1, _02 : 1, _03 : 1, _04 : 1, _05 : 1, _06 : 1, _07 : 1, _08 : 1, _09 : 1, _0A : 1, _0B : 1, _0C : 1, _0D : 1, _0E : 1, _0F : 1;
uint8_t _10 : 1, _11 : 1, _12 : 1, _13 : 1, _14 : 1, _15 : 1, _16 : 1, _17 : 1, _18 : 1, _19 : 1, _1A : 1, _1B : 1, _1C : 1, _1D : 1, _1E : 1, _1F : 1;
uint8_t _20 : 1, _21 : 1, _22 : 1, _23 : 1, _24 : 1, _25 : 1, _26 : 1, _27 : 1, _28 : 1, _29 : 1, _2A : 1, _2B : 1, _2C : 1, _2D : 1, _2E : 1, _2F : 1;
uint8_t _30 : 1, _31 : 1, _32 : 1, _33 : 1, _34 : 1, _35 : 1, _36 : 1, _37 : 1, _38 : 1, _39 : 1, _3A : 1, _3B : 1, _3C : 1, _3D : 1, _3E : 1, _3F : 1;
} u1;
};
int main(void) {
union BitAccessor ba;
ba.u64 = 0x0123456789ABCDEF;
printf("u64: %016llX\n", ba.u64);
printf("u32: %08X %08X\n", ba.u32._0, ba.u32._1);
printf("u16: %04X %04X %04X %04X\n", ba.u16._0, ba.u16._1, ba.u16._2, ba.u16._3);
printf("u8: %02X %02X %02X %02X %02X %02X %02X %02X\n",
ba.u8._0, ba.u8._1, ba.u8._2, ba.u8._3, ba.u8._4, ba.u8._5, ba.u8._6, ba.u8._7);
printf("u4: %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X\n",
ba.u4._0, ba.u4._1, ba.u4._2, ba.u4._3, ba.u4._4, ba.u4._5, ba.u4._6, ba.u4._7,
ba.u4._8, ba.u4._9, ba.u4._A, ba.u4._B, ba.u4._C, ba.u4._D, ba.u4._E, ba.u4._F);
printf("u2: %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X\n",
ba.u2._00, ba.u2._01, ba.u2._02, ba.u2._03, ba.u2._04, ba.u2._05, ba.u2._06, ba.u2._07,
ba.u2._08, ba.u2._09, ba.u2._0A, ba.u2._0B, ba.u2._0C, ba.u2._0D, ba.u2._0E, ba.u2._0F,
ba.u2._10, ba.u2._11, ba.u2._12, ba.u2._13, ba.u2._14, ba.u2._15, ba.u2._16, ba.u2._17,
ba.u2._18, ba.u2._19, ba.u2._1A, ba.u2._1B, ba.u2._1C, ba.u2._1D, ba.u2._1E, ba.u2._1F);
printf("u1: %X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X\n",
ba.u1._00, ba.u1._01, ba.u1._02, ba.u1._03, ba.u1._04, ba.u1._05, ba.u1._06, ba.u1._07,
ba.u1._08, ba.u1._09, ba.u1._0A, ba.u1._0B, ba.u1._0C, ba.u1._0D, ba.u1._0E, ba.u1._0F,
ba.u1._10, ba.u1._11, ba.u1._12, ba.u1._13, ba.u1._14, ba.u1._15, ba.u1._16, ba.u1._17,
ba.u1._18, ba.u1._19, ba.u1._1A, ba.u1._1B, ba.u1._1C, ba.u1._1D, ba.u1._1E, ba.u1._1F,
ba.u1._20, ba.u1._21, ba.u1._22, ba.u1._23, ba.u1._24, ba.u1._25, ba.u1._26, ba.u1._27,
ba.u1._28, ba.u1._29, ba.u1._2A, ba.u1._2B, ba.u1._2C, ba.u1._2D, ba.u1._2E, ba.u1._2F,
ba.u1._30, ba.u1._31, ba.u1._32, ba.u1._33, ba.u1._34, ba.u1._35, ba.u1._36, ba.u1._37,
ba.u1._38, ba.u1._39, ba.u1._3A, ba.u1._3B, ba.u1._3C, ba.u1._3D, ba.u1._3E, ba.u1._3F);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment