我想转换ushort为一个字节,如果ushort等于ushort.MaxValue,则该字节等于0xFF,如果ushort等于零,则该字节等于0x00。直观地说,这意味着摆脱ushort位数组中的其他位。什么是在c#中这样做的最有效的方法?在c#中将ushort转换为字节的最快方法是什么?
回答
是这样的吗?
// 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)
如果您打算倒下我的答案,至少请说明原因。批评帮助我们学习... :) – CodingWithSpike 2011-06-13 14:47:27
快速注意,为了将来参考,由于整数除法,比率将始终为零。可用的许多修补程序中,255.0/65535可能是最简单的。 (我没有downvote) – 2011-06-13 14:47:57
@Corey Ogburn - 好点,谢谢你的收获。 – CodingWithSpike 2011-06-13 15:01:32
我会除以256并将该值设置为一个字节。你可以确定你是否想要舍弃它,但是当你试图将一个值缩小到一个更小的值时,创建一些过于复杂的位掩码方法似乎有点苛刻。如果只有0 == 0和65535 = 256,那么你可能不想把事情弄糟。我错过了什么吗?
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--;
}
}
我喜欢它。我可能会对此进行速度测试。 – 2011-06-15 07:47:27
记住顶位是“最显著” - 这意味着他们应该是缩小尺寸时要保留的尺寸。
您应该右移8位(或除以256) - 在这种情况下,MaxValue将为0xFF,0将为0x00。
你的方式,0x0001将是0x01,但0x0002将是0x00,这是奇怪的。
- 1. 将4字节转换为浮点数的最快方法C++
- 2. 在C++中将字节数组转换为十六进制字符串的最快方法是什么?
- 3. 将ushort []灰度值转换为字节[]
- 4. 什么是将长长转换为NSString的最快方法
- 5. 将Html转换为Pdf的最快方法是什么?
- 6. 将Int32的字节转换为字符串的最简单方法是什么?
- 7. 将图像转换为字节数组的最快方法
- 8. 将csv转换为字符串的最佳方法是什么?
- 9. 在C中旋转bmp图像的最快方法是什么?
- 10. 从DataTable转换为Generic List的最快方法是什么?
- 11. 将一个ushort []数组转换为C#中的单个ushort
- 12. C++:将字节转换为无符号整型的最快方法
- 13. 将CMSampleBufferRef转换为OpenCV IplImage的最佳/最快方法是什么?
- 14. 将html转换为postscript的最佳方法是什么?在java
- 15. 在C++中将UnicodeString转换为const char *的最简单方法是什么?
- 16. 什么是将字符串日期转换为数字的快速方法?
- 17. C#:将ushort转换为浮点数
- 18. 将html表转换为php数组的最快方法是什么?
- 19. 将数字转换为R中最快的方法
- 20. 什么转换为str方法更快?
- 21. 将图像转换为ushort?[]
- 22. 将C++结构转换为c#最简单的方法是什么?
- 23. 如何将字符串转换为ushort
- 24. 将路径转换为* c_char最直接的方法是什么?
- 25. 将ndarray转换为cv :: Mat的最简单方法是什么?
- 26. 将R data.table转换为pandas.DataFrame的最佳方法是什么?
- 27. 将xml转换为html最简单的方法是什么?
- 28. 将has_many关系转换为has_and_belongs_to_many的最佳方法是什么?
- 29. 什么是将DataTable转换为对象的最有效方法[,]?
- 30. 将org.json.JSONObject转换为javax.sql.rowset.serial.SerialBlob的最佳方法是什么?
我不确定你的“直觉”在这里......你可以举一些更多的输入和输出的例子,以及*为什么*?例如,为什么不忽略底部位呢? – 2011-06-13 14:32:47
除了'ushort.MaxValue'之外,还有哪些值应该转换为? – 2011-06-13 14:44:26
是的。你对我的直觉完全错误是正确的。 – 2011-06-13 15:37:30