Более явное решение (также более простое для понимания и расширенное для байтов до int i.e.):
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Explicit)]
struct Byte2Short {
[FieldOffset(0)]
public byte lowerByte;
[FieldOffset(1)]
public byte higherByte;
[FieldOffset(0)]
public short Short;
}
Использование:
var result = (new Byte2Short(){lowerByte = b1, higherByte = b2}).Short;
Это позволяет компилятору выполнять все операции с битами, и поскольку Byte2Short является структурой, а не классом, новая даже не выделяет новый объект кучи;)