转换的32位数据转换为unsigned long值
我有这样的事情:转换的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位寄存器的示例。
我尝试了总结,并希望澄清一下你的问题的一些意见已经表明:
如果你想从你的图像数量是00001010 00001011 00010000 00011011
= 0x0A0B101B
= 168497179
in one single long
value and you have two ints 0001000000011011
= 0x101B
= 4123
和0000101000001011
= 0x0A0B
= 2571
比你的代码是正确的。
我会建议你,因为他们很容易地显示有0x0A0B
& 0x101B
和0x009A4A8B
= 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
。因此,将二进制或十六进制数字转换为十进制是一项非常重要的任务(对于人类而言),最好使用计算器。
10111627不是由4123和2571组成的,不管我怎么看它。在十六进制中,小部分是0x101b和0x0a0b,我不能以任何合理的方式将它转换为0x009a4a8b。你怎么知道输出应该是什么?这部分是否正确? – harold
你的代码是正确的。你的测试是错误的。 – erickson
请参阅我更新的帖子。有图像显示如何将值存储到32位寄存器中,以及如何得到结果为10111627 – Josef