将32位数据转换为无符号长值

时间:2017-10-11 20:26:12

标签: java binary byte shift

我有这样的事情:

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位寄存器的示例。

1 个答案:

答案 0 :(得分:0)

我尝试总结并希望澄清对您的问题的几条评论已经表明的内容:

如果您想从图像中获取数字 00001010 00001011 00010000 00011011 = 0x0A0B101B = 168497179
在一个long值中,您有两个整数 0001000000011011 = 0x101B = 4123
0000101000001011 = 0x0A0B = 2571
比你的代码正确

我建议你习惯十六进制数字,因为它们很容易表明0x0A0B&amp;之间没有二元关系。 0x101B0x009A4A8B = 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。因此,将二进制或十六进制数转换为十进制是一项非常重要的任务(对于人类而言),最好使用计算器。