我有一个由两个字节组成的ushort。
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Y =位10-0,二进制补码尾数整数。
N = 15-11位,二进制补码整数。
X = Y * 2 ^ N
我需要将X作为字符串输出。
这就是我的尝试:
private string ConvertLinearToString(ushort data)
{
int N;
int Y;
int X;
N = Convert.ToInt16(GetBitRange((byte)data, 0, 5));
Y = Convert.ToInt16(GetBitRange((byte)data, 6, 11));
X = Convert.ToInt16(Y * Math.Pow(2, (double)N));
return Convert.ToString(result);
}
private byte GetBitRange(byte b, int offset, int count)
{
return Convert.ToByte((b >> offset) & ((1 << count) - 1));
}
我一直试图将GetBitRange()公式转换为使用ushort以及如何处理二进制补码。
答案 0 :(得分:2)
你可以通过使用左移来丢弃你不想要的位然后右移到符号扩展来获得两个补码行为。如果使用32位整数实现GetBitRange:
private static int GetBitRange(int data, int offset, int count)
{
return data << offset >> (32 - count);
}
然后让ushorts在ConvertLinearToString中转换为int:
private static string ConvertLinearToString(ushort data)
{
var n = GetBitRange(data, 16, 5);
var y = GetBitRange(data, 21, 11);
var value = y * Math.Pow(2, n);
return value.ToString();
}
答案 1 :(得分:0)
只需将无符号短整型转换为整数,然后使用该方法进行转换。
ushort u = 10;
string s = Convert.ToString((int)u);
此解决方案相当安全,不会溢出。可能有一些未来版本的C#,这个操作将不再安全。