If you start off with the data in a bit memory data block (e.g. C), you can array index at the bit level. THEN use casting to give you BYTE, WORD, DWORD sized elements (formats too). Note, however, that the bit address casts to BYTE must be BYTE aligned (e.g. C0:UB, C8:UB, C16:UB), casts to WORD must be WORD aligned (C0:UW, C16:UW, C32:UW), casts to DWORD must be DWORD aligned (C0:SD, C32:SD, C64:SD). Note that you can even do C[V10]:UW and V10 index value will be "aligned" (e.g. 0..15 resolve to 0, 16..31 resolve to 16, 32..47 resolve to 32) for WORD alignment (BYTE and DWORD casts with V array index "align" the index values accordingly).