在c#中将ushort转换为字节的最快方法是什么?

时间:2011-06-13 14:30:33

标签: c# type-conversion

我想将ushort转换为一个字节,这样如果ushort等于ushort.MaxValue,那么字节等于0xFF,如果ushort等于零,则字节等于0x00。直觉上,这意味着摆脱ushort位数组中的所有其他位。在c#中最有效的方法是什么?

4 个答案:

答案 0 :(得分:2)

请记住,顶部位是“最重要的” - 意味着它们应该是您在缩小时要保留的位。

你应该右移8(或除以256) - 在这种情况下,MaxValue将是0xFF,0将是0x00。

你的方式,0x0001将是0x01,但0x0002将是0x00,这是奇数。

答案 1 :(得分:1)

 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--;
    }
 }

答案 2 :(得分:1)

这样的东西?

// 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位数组中的所有其他位。

我认为这是一个错误的陈述,因为如果你放弃其他所有,那么你得到:

0000000000000000 => 00000000 (0 => 0 : correct)
0101010101010101 => 00000000 (21845 => 0 : incorrect)
1010101010101010 => 11111111 (43690 => 255 : incorrect)
1111111111111111 => 11111111 (65535 => 255 : correct)

答案 3 :(得分:0)

我将除以256并将该值设置为一个字节。您可以确定是否要关闭事物,但是当您只是尝试将值缩小到较小的集合时,创建一些过于复杂的位屏蔽方法似乎有点苛刻。如果只有0 == 0和65535 = 256,那么你可能不想完成任务。我错过了什么吗?