【问题标题】:Convert 32bit data to unsigned long value将 32 位数据转换为无符号长整数值
【发布时间】:2018-03-23 15:27:38
【问题描述】:

我有这样的事情:

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

【问题讨论】:

  • 10111627 无论我怎么看都不是由 4123 和 2571 组成的。在十六进制中,小部分是 0x101b 和 0x0a0b,我无法以任何合理的方式将其变成 0x009a4a8b。你怎么知道输出应该是什么?这部分一开始就正确吗?
  • 您的代码是正确的。你的测试错了。
  • 请看我更新的帖子。有图像显示该值如何存储到 32 位寄存器中,以及我如何得到结果应该是 10111627
  • 你确定你应该得到 10111627 吗? Wolfram 不这么认为:wolframalpha.com/input/?i=1010000010110001000000011011
  • 这不是基本转换的工作方式,结果确实是 0x0a0b101e aka 168497179,但您将其重新解释为字节数组。

标签: java binary byte shift


【解决方案1】:

我尝试总结并希望澄清您问题中的几个 cmet 已经表明的内容:

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

我建议您习惯十六进制数字,因为它们很容易表明 0x0A0B & 0x101B0x009A4A8B = 10111627 之间没有二进制关系。

顺便说一句,您的图像是矛盾的:二进制数字表示如上所示的数字0x0A0B101B,但十六进制表示0x0A0B101E (注意E,而小数支持二进制值。

终于,我发现了你的缺陷:

您似乎希望将十进制数连接在一起作为结果。但与这里的十六进制不同,它确实在十进制中以这种方式工作!

让我详细说明一下。你有二进制数:
00001010 00001011 00010000 00011011
您可以轻松地将其逐块转换为十六进制
0x0A 0x0B 0x10 0x1B
而不仅仅是让他们在一起
0x0A0B101B

但是魔术连接只是一个只适用于十六进制的简化(以及十六进制在程序员中如此流行的原因)。

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

让我们为前两个块做一个例子:

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

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

正如您在图片中看到的那样,它们都在其中1627。因此将二进制或十六进制数转换为十进制是一项不平凡的任务(对人类而言),最好使用计算器。

【讨论】:

    猜你喜欢
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    相关资源
    最近更新 更多