大三下学期,尝试了下笔试,进去时感觉良好,出来就不行了,很多都考概念和基础,忘都忘完了。
题是这样的:
把两个32位的数合并成一个64位的数,把64位的数分解为两个32位的数
例如两个32位的数为01234567、89ABCDEF,64位的数为123456789ABCDEF(同时注意符号数和无符号数)
当时是要求用户JAVA,我想知道C#怎么解这种题虽然比较简单 但是我还是没怎么做出来,有点闷
对于这种位数的题一直有点头痛
题是这样的:
把两个32位的数合并成一个64位的数,把64位的数分解为两个32位的数
例如两个32位的数为01234567、89ABCDEF,64位的数为123456789ABCDEF(同时注意符号数和无符号数)
当时是要求用户JAVA,我想知道C#怎么解这种题虽然比较简单 但是我还是没怎么做出来,有点闷
对于这种位数的题一直有点头痛
{
static void Main()
{
uint a = 0x01234567;
uint b = 0x89ABCDEF;
ulong c = ((ulong)a << 32) + b;
Console.WriteLine("a = 0x{0:X}, b = 0x{1:X}, c = 0x{2:X}", a, b, c);
}
}
{
static void Main()
{
UInt32 a = 0x01234567;
UInt32 b = 0x89ABCDEF;
// 连在一起
UInt64 c = ((UInt64)a << 32) + b;
Console.WriteLine("a = 0x{0:X}, b = 0x{1:X}, c = 0x{2:X}", a, b, c);
// 拆分
UInt32 d = (UInt32)(c >> 32);
UInt32 e = (UInt32)c;
Console.WriteLine("c = 0x{0:X}, d = 0x{1:X}, e = 0x{2:X}", c, d, e);
}
}
ulong c = ((ulong)a << 32) + b;
//换成下面这样行不
//ulong c=((ulong)a*2^32)+b;
//应该可以吧
ulong c = ((ulong)a * ((ulong)uint.MaxValue + 1)) + b;
ulong c = ((ulong)a * 0x100000000ul) + b;
uint _INT2 = 0x89ABCDEF; byte[] _Temp = new byte[8];
BitConverter.GetBytes(_INT1).CopyTo(_Temp, 4);
BitConverter.GetBytes(_INT2).CopyTo(_Temp, 0);
ulong _Long = BitConverter.ToUInt64(_Temp,0);
byte[] _LongTemp = BitConverter.GetBytes(_Long); uint _X32_1 = BitConverter.ToUInt32(_LongTemp, 4);
uint _X32_2 = BitConverter.ToUInt32(_LongTemp, 0);
intel的CPU不能左移位和右移位32位,这个问题我和几个人商量过了的
只能用别的办法
我过去就是左移32位就得到了不正确的结果了···