Check out how the RISC-V jump offsets are encoded/packed.
| imm[20|10:1|11|19:12] | rd | 1101111 | JAL
I've heard that there's some reason for the bits being strewn about (something about how it enables some microoptimizations on tiny decoders by sharing muxes?), but I don't know the exact specifics.