Как то так?
// set this in a constructor or something.
// it is constant and does not need recalcualted each time.
private float ratio = 255 / 65535; // (or byte.MaxValue / ushort.MaxValue)
// do math
public byte Calcualte(ushort value)
{
return (byte)value * ratio;
}
// test
Assert.AreEqual(byte.MinValue, Calcualte(ushort.MinValue));
Assert.AreEqual(byte.MaxValue, Calcualte(ushort.MaxValue));
Редактировать № 1:
Обратите внимание, что в приведенном выше примере используется округление пола, поэтому ushort.MaxValue - 1
превратится в байт 254. Возможно, вместо этого лучше использовать Math.Round (), возможно: return (byte)Math.Round(value * ratio);
Редактировать № 2:
Вы изначально заявили:
Интуитивно, это означает избавление от любого другого бита в массиве ushort bit.
Я думаю, что это ложное утверждение, потому что, если вы отбросите каждый второй бит, то вы получите:
0000000000000000 => 00000000 (0 => 0 : correct)
0101010101010101 => 00000000 (21845 => 0 : incorrect)
1010101010101010 => 11111111 (43690 => 255 : incorrect)
1111111111111111 => 11111111 (65535 => 255 : correct)