static ushort[] numbersUshort = {1, 2, 3, 4};
static uint[] numbersUint;
public static void Main() {
numNumbers = numbersUshort.Length;
PackInto(numbersUshort, out numbersUint);
for(int i = 0; i < numbersUint.Length; i++) {
Console.WriteLine("Packed number#" + i + ": " + Convert.ToString(numbersUint[i], 2).PadLeft(32,'0'));
UnpackInto(numbersUint, out unpacked, numNumbers);
for(int i = 0; i < unpacked.Length; i++) {
Console.WriteLine("Unpacked number#" + i + ": " + unpacked[i]);
public static void PackInto(ushort[] source, out uint[] destination) {
destination = new uint[(int) Math.Ceiling(source.Length / 2f)];
for(int i = 0; i < destination.Length; i++) {
uint a = (uint) source[2*i];
uint b = (uint) source[2*i + 1];
public static void UnpackInto(uint[] source, out ushort[] destination, int count) {
destination = new ushort[count];
for(int i = 0; i < count; i++) {
destination[i] = (ushort) (source[major] >> (16*(minor)));