2017-10-11 99 views
0

我有这样的事情:转换的32位数据转换为unsigned long值

int[0] = 4123; 
int[1] = 2571; 

我想将它们结合起来,并在Java的一个长期价值。 这是我的尝试:

int[] r = { 4123, 2571 }; 
long result = ((r[1] & 0xFFFF) << 16 | (rs[0] & 0xFFFF)); 
System.out.prinln(result); 

输出应该是:10111627,但我得到168497179.也许我错过转换的东西,但没有想法是什么......

编辑

这是如何将值放入32位寄存器的示例。

+1

10111627不是由4123和2571组成的,不管我怎么看它。在十六进制中,小部分是0x101b和0x0a0b,我不能以任何合理的方式将它转换为0x009a4a8b。你怎么知道输出应该是什么?这部分是否正确? – harold

+1

你的代码是正确的。你的测试是错误的。 – erickson

+0

请参阅我更新的帖子。有图像显示如何将值存储到32位寄存器中,以及如何得到结果为10111627 – Josef

回答

0

我尝试了总结,并希望澄清一下你的问题的一些意见已经表明:

如果你想从你的图像数量是
00001010 00001011 00010000 00011011 = 0x0A0B101B = 168497179
in one single long value and you have two ints
0001000000011011 = 0x101B = 4123
0000101000001011 = 0x0A0B = 2571
比你的代码是正确的

我会建议你,因为他们很容易地显示有0x0A0B & 0x101B0x009A4A8B = 10111627之间没有二元关系习惯于十六进制数。

BTW图像是矛盾的:所述二进制数代表所看到上面的数字0x0A0B101B但十六进制数读0x0A0B101E(注意E而小数支持的二进制值。

最后,我想通了,你的缺陷:

你似乎希望得到串联在一起作为结果的十进制数。但不同于这里的十六进制,它的确如此而不是以十进制的方式工作!

让我详细说明一下。你有二进制数:
00001010 00001011 00010000 00011011
,你可以很容易地转换为十六进制逐块
0x0A 0x0B 0x10 0x1B
并不仅仅是它们连接起来
0x0A0B101B

但是,神奇的加入只是一个简化仅适用于十六进制(以及十六进制在程序员中如此受欢迎的原因)。

长版本是您必须将较高的块/字节(朝左)与前一个块(右侧)的'基础'相乘。最右边的块总是乘以1。下一个块的基址是(因为第一个块中有8位)2 = 256 = 0x100。第三个块的基址是(8+8位)2 = 65536 = 0x10000。最后(最左边)必须乘以(8+8+8位)2 = 16777216 = 0x1000000

允许使前两个块的一个示例:

十六进制:
0x10 || 0x1B
(0x10 * 0x100) + (0x1B* 0x1)
0x1000 + 0x1B = 0x101B

十进制:
16 || 27
(16 * 256) + (27 * 1)
4096 + 27 = 4123

正如你可以在图片上看到他们都在它(注意E/B问题,它是十进制6/3问题)但没有1627 。因此,将二进制或十六进制数字转换为十进制是一项非常重要的任务(对于人类而言),最好使用计算器。