Что-то вроде этого должно сделать это:
var nibble1 = ((a & 0x80) << 3) | ((a & 0x20) << 2) |
((a & 0x08) << 1) | (a & 0x02);
var nibble2 = ((b & 0x80) << 3) | ((b & 0x20) << 2) |
((b & 0x08) << 1) | (b & 0x02);
var result = (nibble1 << 4) | nibble2;
Для каждого входного байта вы берете «первый» (на самом деле обычно считается, начиная с другого конца, но я пойду с этим звучит более прямо здесь) байта, сдвиньте его на 3 места (чтобы освободить место для него для остальные), добавьте «третий» байт (сдвинув его на два места) и т. д.
Затем вы сдвигаете первый клев, вы только что вычислили четыре места (чтобы освободить место для второго) и склеили их вместе.