Какой самый быстрый способ преобразовать ushort в байт в c #? - PullRequest
0 голосов
/ 13 июня 2011

Я хочу преобразовать ushort в байт так, чтобы, если ushort равнялся ushort.MaxValue, тогда байт был равен 0xFF, а если ushort равнялся нулю, тогда байт был равен 0x00Интуитивно это означает избавление от любого другого бита в массиве ushort.Какой самый эффективный способ сделать это в c #?

Ответы [ 4 ]

2 голосов
/ 13 июня 2011

Помните, что старшие биты являются «наиболее значимыми» - это означает, что они должны быть теми, которые вы хотите сохранить при уменьшении.

Вы должны просто сдвинуть вправо 8 (или разделить на 256) - MaxValue будет 0xFF и 0 также будет 0x00 в этом случае.

По-вашему, 0x0001 будет 0x01, но 0x0002 будет 0x00, что странно.

1 голос
/ 13 июня 2011
 byte output = 0;
 //ushort us = value;
 if (us == ushort.MaxValue)
 {
     output = 0xff;
 }
 else
 {     
    ushort ush = us & 0xAAAA; // 0xAAAA => Bin 1010101010101010
    int i = 7;
    while(ush > 0)
    {
       output = output | ((ush & 0x0001) << i);
       ush = ush  >> 2;                  
       i--;
    }
 }
1 голос
/ 13 июня 2011

Как то так?

// 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)
0 голосов
/ 13 июня 2011

Я бы разделил на 256 и установил бы это значение в байт.Вы можете определить, хотите ли вы округлить или нет, но создание какой-то слишком сложной методологии маскирования битов кажется довольно жестким, когда вы просто пытаетесь уменьшить значение до меньшего набора.Если только 0 == 0 и 65535 = 256, вы можете не хотеть округлять вещи.Я что-то упустил?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...