作者m339606 (mize)
看板C_Sharp
标题Re: [问题] 负数处理
时间Tue Apr 12 21:09:51 2016
※ 引述《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);
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.232.114.250
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1460466596.A.D43.html
1F:推 Litfal: 认真回给推,这个做法比较符合C#精神,适合不熟bitwise的 04/12 21:48
2F:→ Litfal: 但其实原问题用unsigned也能解ww 04/12 21:49
※ 编辑: m339606 (36.232.114.250), 04/12/2016 21:53:43
3F:推 Litfal: Convert.ToString(a, 2) 04/12 22:14
4F:→ Litfal: 顺便一提,输出二进位字串可以用 (这行没推到@@) 04/12 22:15
5F:→ dabiddabid: 用BitConverter解决了,感谢大家 04/18 09:21