There is no "indirect" casting mechanism, e.g. to cast to a variable bit of a V WORD.
HOWEVER, if you ever need to do any "indirect" manipulation, make the DATA-TYPE of the user data-block be the SMALLEST SIZE of indirection you think you need. If it's BITs, make your data-block a block of BITs, EVEN IF you want to use them as REALs (because you can always cast to LARGER):
MyBlock as bits, but I want to use them as 100 REALs (so it would be 3200 "bits" long, cuz each REAL is 32 bits)
Now I can easily reference bits individually:
MyBlock0
MyBlock1
or as REALs
MyBlock0:R // the first REAL
MyBlock32:R // the second REAL (yes, ID's need to bump by 32 at a time)
MyBlock64:R // the third
MyBlock96:R // the fourth
But I can indirectly reference bits (array index is BIT ID)
MyBlock[V0]
where V0 is the bit ID
And I can even look at REALs them indirectly as arrays
MyBlock[V0]:R
where V0 is still the bit ID, hence it should equal 0 then 32 then 64 then 96 then ... (not 0, 1, 2, remember the index is still a BIT ID).
Note: V0 actually COULD be anything, but even that is handled:
e.g. V0 equal to 0..31 resolves to ID of 0, V0 equal to 32..63 resolves to ID of 32, V0 equal to 64..95 resolves to 64, V0 of 96..127 resolves to ID of 96
Cast to REAL or Signed Word (:SW) or Unsigned Byte (:UB), but the BASE data-block is BITs.
Conclusion: You can use array indexing to casts of LARGER sizes. Array index works on the ID portion, but you cannot use indexing on the CAST side (past the ":"). Hence, make your data-blocks data-type be the SMALLEST size needed for "indirect casting".