Re: [问题] 负数处理

楼主: m339606 (mize)   2016-04-12 21:09:51
※ 引述《dabiddabid (dabid')》之铭言:
: 小弟要将两个Int16数字组成Int32
: Int16 a = -30 ;//1111 1111 1110 0010
: Int16 b = -19456 ; //1011 0100 0000 0000
: 现在想把ab组合在一起成Int32(ab)//1111 1111 1110 0010 1011 0100 0000 0000
: 原本是想将两个都先ToInt32将a << 16 然后(a | b)
: 但现在发现负数Int16转Int32会将前面全部补1
: b会变成1111 1111 1111 1111 1011 0100 0000 0000
: 但我想要的是0000 0000 0000 0000 1011 0100 0000 0000
: 也就是想要a|b结果是-1920000//11111111111000101011010000000000
: 但实际现在结果却是-19456 //11111111111111111011010000000000
: 请问这要如何解决?
因为你没有指定是Big Endian还是Little Endian
按照你给的范例直接使用默认的Little Endian来转换
Int16 a = -30;
var a_bits = new BitArray(BitConverter.GetBytes(a));
string a_bitsString = "";
for (int i = 0; i < a_bits.Count; i++)
a_bitsString += a_bits[i] ? "1" : "0";
Console.WriteLine(a_bitsString);
输出后结果为a = 0100 0111 1111 1111 与你文中指出的顺序是颠倒的
所以你使用的应该是Big Endian
然后按照你文中的要求感觉就是将两个数字的bytes组合起来
那程式码应该是如下
Int16 a = -30;
Int16 b = -19456;
List<byte> temp = new List<byte>();
temp.AddRange(BitConverter.GetBytes(a));
temp.AddRange(BitConverter.GetBytes(b));
int c = BitConverter.ToInt32(temp.ToArray(), 0);
作者: Litfal (Litfal)   2016-04-12 21:48:00
认真回给推,这个做法比较符合C#精神,适合不熟bitwise的但其实原问题用unsigned也能解wwConvert.ToString(a, 2)顺便一提,输出二进制字串可以用 (这行没推到@@)
作者: dabiddabid (dabid')   2016-04-18 09:21:00
用BitConverter解决了,感谢大家

Links booklink

Contact Us: admin [ a t ] ucptt.com