我有这样的事情:
int[0] = 4123;
int[1] = 2571;
我想将它们组合起来并在Java中创建一个long值。 这是我的尝试:
int[] r = { 4123, 2571 };
long result = ( (r[1] & 0xFFFF) << 16 | (rs[0] & 0xFFFF) );
System.out.prinln(result);
输出应该是:10111627但是我得到了168497179.可能我错过了转换中的一些东西但是不知道是什么......
修改
这是将值放入32位寄存器的示例。
答案 0 :(得分:0)
我尝试总结并希望澄清对您的问题的几条评论已经表明的内容:
如果您想从图像中获取数字
00001010 00001011 00010000 00011011
= 0x0A0B101B
= 168497179
在一个long
值中,您有两个整数
0001000000011011
= 0x101B
= 4123
和
0000101000001011
= 0x0A0B
= 2571
比你的代码正确。
我建议你习惯十六进制数字,因为它们很容易表明0x0A0B
&amp;之间没有二元关系。 0x101B
和0x009A4A8B
= 10111627
。
顺便说一下你的图像是矛盾的:二进制数字代表数字0x0A0B101B
以上,但十六进制数字为0x0A0B101E
(注意E
)小数表支持二进制值。
最后,我发现了你的缺陷:
您似乎希望将结果的十进制数连接在一起。但与十六进制不同的是,不以十进制方式工作
让我详细说明一下。你有二进制数:
00001010 00001011 00010000 00011011
您可以轻松地逐块转换为十六进制
0x0A 0x0B 0x10 0x1B
而不仅仅是将它们加在一起
0x0A0B101B
但是这个魔术连接只是一个仅适用于hex的简化(以及hex在程序员中如此受欢迎的原因)。
长版本是你必须将较高的块/字节(向左)乘以前一个块的'基础'(向右)。最右边的块总是乘以1
。下一个块的基础是(因为第一个块中有8
个位)2 8 = 256
= 0x100
。第三个块的基础是(8+8
位)2 16 = 65536
= 0x10000
。最后一个(最左边)必须乘以(8+8+8
位)2 24 = 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
。因此,将二进制或十六进制数转换为十进制是一项非常重要的任务(对于人类而言),最好使用计算器。