【问题标题】:Get Number from two uints从两个 uint 中获取数字
【发布时间】:2011-07-20 16:22:08
【问题描述】:

我在 Flash+ActionScript3 中从网络读取一个带符号的 64 位整数 (Java long),并将其存储为两个 uint(前 32 位和后 32 位)。

var l:LongNumber = new LongNumber();
l.msb = socket.readUnsignedInt();
l.lsb = socket.readUnsignedInt();

如何将其转换为Number 的实际数字?

我知道Number 只能包含 53 位整数,而不是 64,但这已经足够了(尽管在转换更大的数字时能够抛出 Error 会很好)。

【问题讨论】:

    标签: flash actionscript-3 math numbers integer


    【解决方案1】:

    是的,readDouble() 在这里没用,它会将您的 64 位整数解释为 IEEE 754 格式的双精度浮点数(符号位 + 11 个指数位 + 52 个小数位),这将给你一个垃圾结果。

    如果您需要支持负数,

    (Number(msb) * Math.pow(2, 32)) + Number(lsb) 不是一个完整的解决方案。如果您的数字为零或不大于 2^63-1 的正数(这样未设置符号位),此代码才会得到正确的结果。如果设置了符号位,您的代码将有效地将 64 位解释为无符号整数,这不是 Java 发送给您的。如果您在使用您的解决方案并想知道为什么总是得到积极的结果,这就是原因。

    在一行代码中支持负数和正数可能有一些非常酷的小技巧,但是因为我现在无法解决这个问题,所以我会告诉你我看到解决方案的直接方式我的想法:

    我会使用 msb & 0x80000000 来读取符号位。如果未设置,请使用上面的公式。如果已设置,请先将您的数字从 2 的补码格式转换为无符号格式:

    msb = (msb ^ 0xFFFFFFFF);

    lsb = (lsb ^ 0xFFFFFFFF) + 1;

    然后将你的论坛应用到 msb 和 lsb 并(因为设置了符号位)将结果数字乘以 -1。

    if (msb & 0x80000000)
    {
        msb ^= 0xFFFFFFFF;
        lsb ^= 0xFFFFFFFF;
        result = -(Number(msb)*4294967296 + Number(lsb) + 1);
    }
    else
    {
        result = Number(msb)*4294967296 + Number(lsb);
    }
    

    【讨论】:

    • 我实际上并没有使用负数,即使这个数字是有符号的,但如果我曾经这样做过,很高兴知道。
    • 请注意,我在计算中删除了符号位归零步骤,这是我思考过程的一部分,但不是实际计算的一部分——这作为 XORing 的一部分自动发生。如果您有一个负整数,您需要做的就是翻转所有位并添加一个以获得 2 的补码,这会在通过您的论坛时为您提供负数的绝对值,然后您将其乘以 -1 到获取实际值。
    【解决方案2】:

    我找到了自己的解决方案(仅适用于正数)

    (Number(msb) * Math.pow(2, 32)) + Number(lsb)

    或硬编码 2^32

    (Number(msb) * 4294967296) + Number(lsb)

    【讨论】:

      【解决方案3】:

      readDouble()
      更新:

      var ba:ByteArray = new ByteArray();
      ba.writeUnsignedInt(uint1);
      ba.writeUnsignedInt(uint2);
      ba.position = 0;
      result = ba.readDouble();
      

      【讨论】:

      • 如果我这样做(msb << 32) + lsb,它就会变成msb + lsbreadDouble 从浮点格式读取,而不是整数。
      猜你喜欢
      • 1970-01-01
      • 2021-01-06
      • 2013-04-02
      • 1970-01-01
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      相关资源
      最近更新 更多