我想将ushort转换为一个字节,这样如果ushort等于ushort.MaxValue,那么字节等于0xFF,如果ushort等于零,则字节等于0x00。直觉上,这意味着摆脱ushort位数组中的所有其他位。在c#中最有效的方法是什么?
答案 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,那么你可能不想完成任务。我错过了什么吗?